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/08/18 14:48:09 UTC

[01/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 4ddbaa658 -> 7cafc4121


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
index fc71310..e6f60c1 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
@@ -70,664 +70,687 @@
 <span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.62"></a>
 <span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.63"></a>
 <span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hdfs.DistributedFileSystem;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hdfs.MiniDFSCluster;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hdfs.protocol.HdfsConstants;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.junit.After;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.junit.AfterClass;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.junit.Before;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.BeforeClass;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.ClassRule;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.Rule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Test;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.experimental.categories.Category;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.rules.TestName;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.slf4j.Logger;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.LoggerFactory;<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>/**<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * WAL tests that can be reused across providers.<a name="line.81"></a>
-<span class="sourceLineNo">082</span> */<a name="line.82"></a>
-<span class="sourceLineNo">083</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.83"></a>
-<span class="sourceLineNo">084</span>public class TestWALFactory {<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @ClassRule<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      HBaseClassTestRule.forClass(TestWALFactory.class);<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private static final Logger LOG = LoggerFactory.getLogger(TestWALFactory.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  protected static Configuration conf;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static MiniDFSCluster cluster;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  protected static Path hbaseDir;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  protected static Path hbaseWALDir;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  protected FileSystem fs;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  protected Path dir;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  protected WALFactory wals;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  private ServerName currentServername;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  @Rule<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public final TestName currentTest = new TestName();<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  @Before<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public void setUp() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    fs = cluster.getFileSystem();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    dir = new Path(hbaseDir, currentTest.getMethodName());<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    this.currentServername = ServerName.valueOf(currentTest.getMethodName(), 16010, 1);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    wals = new WALFactory(conf, this.currentServername.toString());<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>  @After<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public void tearDown() throws Exception {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    // testAppendClose closes the FileSystem, which will prevent us from closing cleanly here.<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    try {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      wals.close();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    } catch (IOException exception) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.warn("Encountered exception while closing wal factory. If you have other errors, this" +<a name="line.120"></a>
-<span class="sourceLineNo">121</span>          " may be the cause. Message: " + exception);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      LOG.debug("Exception details for failure to close wal factory.", exception);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    FileStatus[] entries = fs.listStatus(new Path("/"));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    for (FileStatus dir : entries) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      fs.delete(dir.getPath(), true);<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><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  @BeforeClass<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  public static void setUpBeforeClass() throws Exception {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    CommonFSUtils.setWALRootDir(TEST_UTIL.getConfiguration(), new Path("file:///tmp/wal"));<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    // Make block sizes small.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    TEST_UTIL.getConfiguration().setInt("dfs.blocksize", 1024 * 1024);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    // needed for testAppendClose()<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    // quicker heartbeat interval for faster DN death notification<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    TEST_UTIL.getConfiguration().setInt("dfs.namenode.heartbeat.recheck-interval", 5000);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    TEST_UTIL.getConfiguration().setInt("dfs.heartbeat.interval", 1);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    TEST_UTIL.getConfiguration().setInt("dfs.client.socket-timeout", 5000);<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    // faster failover with cluster.shutdown();fs.close() idiom<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    TEST_UTIL.getConfiguration()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .setInt("hbase.ipc.client.connect.max.retries", 1);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        "dfs.client.block.recovery.retries", 1);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      "hbase.ipc.client.connection.maxidletime", 500);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.timeout", 10000);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.dfs.timeout", 1000);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    TEST_UTIL.getConfiguration().set(CoprocessorHost.WAL_COPROCESSOR_CONF_KEY,<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        SampleRegionWALCoprocessor.class.getName());<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    TEST_UTIL.startMiniDFSCluster(3);<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    conf = TEST_UTIL.getConfiguration();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    cluster = TEST_UTIL.getDFSCluster();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    hbaseDir = TEST_UTIL.createRootDir();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    hbaseWALDir = TEST_UTIL.createWALRootDir();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  @AfterClass<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  public static void tearDownAfterClass() throws Exception {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Test<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  public void canCloseSingleton() throws IOException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    WALFactory.getInstance(conf).close();<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>  /**<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * Just write multiple logs then split.  Before fix for HADOOP-2283, this<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * would fail.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @throws IOException<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  @Test<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  public void testSplit() throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    final TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    final byte [] rowName = tableName.getName();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    final int howmany = 3;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    RegionInfo[] infos = new RegionInfo[3];<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    Path tabledir = FSUtils.getTableDir(hbaseDir, tableName);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    fs.mkdirs(tabledir);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    for (int i = 0; i &lt; howmany; i++) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      infos[i] = RegionInfoBuilder.newBuilder(tableName).setStartKey(Bytes.toBytes("" + i))<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          .setEndKey(Bytes.toBytes("" + (i + 1))).build();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      fs.mkdirs(new Path(tabledir, infos[i].getEncodedName()));<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info("allo " + new Path(tabledir, infos[i].getEncodedName()).toString());<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    scopes.put(Bytes.toBytes("column"), 0);<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALFactory.Providers;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hdfs.DistributedFileSystem;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hdfs.MiniDFSCluster;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hdfs.protocol.HdfsConstants;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.After;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.AfterClass;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.junit.Before;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.BeforeClass;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>/**<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * WAL tests that can be reused across providers.<a name="line.82"></a>
+<span class="sourceLineNo">083</span> */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.84"></a>
+<span class="sourceLineNo">085</span>public class TestWALFactory {<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @ClassRule<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      HBaseClassTestRule.forClass(TestWALFactory.class);<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private static final Logger LOG = LoggerFactory.getLogger(TestWALFactory.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  protected static Configuration conf;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static MiniDFSCluster cluster;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  protected static Path hbaseDir;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  protected static Path hbaseWALDir;<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  protected FileSystem fs;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  protected Path dir;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  protected WALFactory wals;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  private ServerName currentServername;<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @Rule<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public final TestName currentTest = new TestName();<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @Before<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public void setUp() throws Exception {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    fs = cluster.getFileSystem();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    dir = new Path(hbaseDir, currentTest.getMethodName());<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    this.currentServername = ServerName.valueOf(currentTest.getMethodName(), 16010, 1);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    wals = new WALFactory(conf, this.currentServername.toString());<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>  @After<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public void tearDown() throws Exception {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // testAppendClose closes the FileSystem, which will prevent us from closing cleanly here.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    try {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      wals.close();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    } catch (IOException exception) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      LOG.warn("Encountered exception while closing wal factory. If you have other errors, this" +<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          " may be the cause. Message: " + exception);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      LOG.debug("Exception details for failure to close wal factory.", exception);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    FileStatus[] entries = fs.listStatus(new Path("/"));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    for (FileStatus dir : entries) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      fs.delete(dir.getPath(), true);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @BeforeClass<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public static void setUpBeforeClass() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    CommonFSUtils.setWALRootDir(TEST_UTIL.getConfiguration(), new Path("file:///tmp/wal"));<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Make block sizes small.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    TEST_UTIL.getConfiguration().setInt("dfs.blocksize", 1024 * 1024);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // needed for testAppendClose()<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    // quicker heartbeat interval for faster DN death notification<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    TEST_UTIL.getConfiguration().setInt("dfs.namenode.heartbeat.recheck-interval", 5000);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    TEST_UTIL.getConfiguration().setInt("dfs.heartbeat.interval", 1);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    TEST_UTIL.getConfiguration().setInt("dfs.client.socket-timeout", 5000);<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>    // faster failover with cluster.shutdown();fs.close() idiom<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    TEST_UTIL.getConfiguration()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .setInt("hbase.ipc.client.connect.max.retries", 1);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        "dfs.client.block.recovery.retries", 1);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      "hbase.ipc.client.connection.maxidletime", 500);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.timeout", 10000);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.dfs.timeout", 1000);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    TEST_UTIL.getConfiguration().set(CoprocessorHost.WAL_COPROCESSOR_CONF_KEY,<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        SampleRegionWALCoprocessor.class.getName());<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    TEST_UTIL.startMiniDFSCluster(3);<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>    conf = TEST_UTIL.getConfiguration();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    cluster = TEST_UTIL.getDFSCluster();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    hbaseDir = TEST_UTIL.createRootDir();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    hbaseWALDir = TEST_UTIL.createWALRootDir();<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>  @AfterClass<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  public static void tearDownAfterClass() throws Exception {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Test<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public void canCloseSingleton() throws IOException {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    WALFactory.getInstance(conf).close();<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>   * Just write multiple logs then split.  Before fix for HADOOP-2283, this<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * would fail.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * @throws IOException<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  @Test<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public void testSplit() throws IOException {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    final TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    final byte [] rowName = tableName.getName();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final int howmany = 3;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    RegionInfo[] infos = new RegionInfo[3];<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    Path tabledir = FSUtils.getTableDir(hbaseDir, tableName);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    fs.mkdirs(tabledir);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    for (int i = 0; i &lt; howmany; i++) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      infos[i] = RegionInfoBuilder.newBuilder(tableName).setStartKey(Bytes.toBytes("" + i))<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          .setEndKey(Bytes.toBytes("" + (i + 1))).build();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      fs.mkdirs(new Path(tabledir, infos[i].getEncodedName()));<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      LOG.info("allo " + new Path(tabledir, infos[i].getEncodedName()).toString());<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    scopes.put(Bytes.toBytes("column"), 0);<a name="line.193"></a>
 <span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // Add edits for three regions.<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    for (int ii = 0; ii &lt; howmany; ii++) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      for (int i = 0; i &lt; howmany; i++) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        final WAL log =<a name="line.198"></a>
-<span class="sourceLineNo">199</span>            wals.getWAL(infos[i]);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        for (int j = 0; j &lt; howmany; j++) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          WALEdit edit = new WALEdit();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>          byte [] family = Bytes.toBytes("column");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          byte [] qualifier = Bytes.toBytes(Integer.toString(j));<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          byte [] column = Bytes.toBytes("column:" + Integer.toString(j));<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          edit.add(new KeyValue(rowName, family, qualifier,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>              System.currentTimeMillis(), column));<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          LOG.info("Region " + i + ": " + edit);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          WALKeyImpl walKey =  new WALKeyImpl(infos[i].getEncodedNameAsBytes(), tableName,<a name="line.208"></a>
-<span class="sourceLineNo">209</span>              System.currentTimeMillis(), mvcc, scopes);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          log.append(infos[i], walKey, edit, true);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          walKey.getWriteEntry();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        log.sync();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        log.rollWriter(true);<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>    wals.shutdown();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // The below calculation of logDir relies on insider information... WALSplitter should be connected better<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // with the WAL system.... not requiring explicit path. The oldLogDir is just made up not used.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    Path logDir =<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        new Path(new Path(hbaseWALDir, HConstants.HREGION_LOGDIR_NAME),<a name="line.221"></a>
-<span class="sourceLineNo">222</span>            this.currentServername.toString());<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    Path oldLogDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    List&lt;Path&gt; splits = WALSplitter.split(hbaseWALDir, logDir, oldLogDir, fs, conf, wals);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    verifySplits(splits, howmany);<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>  /**<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * Test new HDFS-265 sync.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @throws Exception<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void Broken_testSync() throws Exception {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    // First verify that using streams all works.<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    Path p = new Path(dir, currentTest.getMethodName() + ".fsdos");<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    FSDataOutputStream out = fs.create(p);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    out.write(tableName.getName());<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    Method syncMethod = null;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    try {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      syncMethod = out.getClass().getMethod("hflush", new Class&lt;?&gt; []{});<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    } catch (NoSuchMethodException e) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      try {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        syncMethod = out.getClass().getMethod("sync", new Class&lt;?&gt; []{});<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      } catch (NoSuchMethodException ex) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        fail("This version of Hadoop supports neither Syncable.sync() " +<a name="line.247"></a>
-<span class="sourceLineNo">248</span>            "nor Syncable.hflush().");<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    syncMethod.invoke(out, new Object[]{});<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    FSDataInputStream in = fs.open(p);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    assertTrue(in.available() &gt; 0);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    byte [] buffer = new byte [1024];<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    int read = in.read(buffer);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    assertEquals(tableName.getName().length, read);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    out.close();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    in.close();<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final int total = 20;<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    WAL.Reader reader = null;<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>    try {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      RegionInfo info = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      scopes.put(tableName.getName(), 0);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      final WAL wal = wals.getWAL(info);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (int i = 0; i &lt; total; i++) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        WALEdit kvs = new WALEdit();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      // Now call sync and try reading.  Opening a Reader before you sync just<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      // gives you EOFE.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      wal.sync();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // Open a Reader.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      reader = wals.createReader(fs, walPath);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      int count = 0;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      WAL.Entry entry = new WAL.Entry();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      while ((entry = reader.next(entry)) != null) count++;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      assertEquals(total, count);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      reader.close();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      // Add test that checks to see that an open of a Reader works on a file<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // that has had a sync done on it.<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      for (int i = 0; i &lt; total; i++) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        WALEdit kvs = new WALEdit();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      wal.sync();<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      reader = wals.createReader(fs, walPath);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      count = 0;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      assertTrue(count &gt;= total);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      reader.close();<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      // If I sync, should see double the edits.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      wal.sync();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      reader = wals.createReader(fs, walPath);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      count = 0;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      assertEquals(total * 2, count);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      reader.close();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      // Now do a test that ensures stuff works when we go over block boundary,<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      // especially that we return good length on file.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      final byte [] value = new byte[1025 * 1024];  // Make a 1M value.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      for (int i = 0; i &lt; total; i++) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        WALEdit kvs = new WALEdit();<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), value));<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            System.currentTimeMillis(), mvcc, scopes), kvs,  true);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Now I should have written out lots of blocks.  Sync then read.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      wal.sync();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      reader = wals.createReader(fs, walPath);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      count = 0;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      assertEquals(total * 3, count);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      reader.close();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // shutdown and ensure that Reader gets right length also.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      wal.shutdown();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      reader = wals.createReader(fs, walPath);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      count = 0;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      assertEquals(total * 3, count);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      reader.close();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    } finally {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (reader != null) reader.close();<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><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  private void verifySplits(final List&lt;Path&gt; splits, final int howmany)<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    assertEquals(howmany * howmany, splits.size());<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    for (int i = 0; i &lt; splits.size(); i++) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      LOG.info("Verifying=" + splits.get(i));<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      WAL.Reader reader = wals.createReader(fs, splits.get(i));<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      try {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        int count = 0;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        String previousRegion = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        long seqno = -1;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        WAL.Entry entry = new WAL.Entry();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        while((entry = reader.next(entry)) != null) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          WALKey key = entry.getKey();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          String region = Bytes.toString(key.getEncodedRegionName());<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          // Assert that all edits are for same region.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          if (previousRegion != null) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>            assertEquals(previousRegion, region);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          LOG.info("oldseqno=" + seqno + ", newseqno=" + key.getSequenceId());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          assertTrue(seqno &lt; key.getSequenceId());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          seqno = key.getSequenceId();<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          previousRegion = region;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          count++;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        assertEquals(howmany, count);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      } finally {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        reader.close();<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>  /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * We pass different values to recoverFileLease() so that different code paths are covered<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   *<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * For this test to pass, requires:<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * 1. HDFS-200 (append support)<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * 2. HDFS-988 (SafeMode should freeze file operations<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   *              [FSNamesystem.nextGenerationStampForBlock])<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * 3. HDFS-142 (on restart, maintain pendingCreates)<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  @Test<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void testAppendClose() throws Exception {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    TableName tableName =<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        TableName.valueOf(currentTest.getMethodName());<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    RegionInfo regionInfo = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>    WAL wal = wals.getWAL(regionInfo);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    int total = 20;<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    scopes.put(tableName.getName(), 0);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    for (int i = 0; i &lt; total; i++) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      WALEdit kvs = new WALEdit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      wal.append(regionInfo, new WALKeyImpl(regionInfo.getEncodedNameAsBytes(), tableName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          System.currentTimeMillis(), mvcc, scopes),<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        kvs, true);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // Now call sync to send the data to HDFS datanodes<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    wal.sync();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>     int namenodePort = cluster.getNameNodePort();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    final Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // Add edits for three regions.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    for (int ii = 0; ii &lt; howmany; ii++) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      for (int i = 0; i &lt; howmany; i++) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        final WAL log =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>            wals.getWAL(infos[i]);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        for (int j = 0; j &lt; howmany; j++) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          WALEdit edit = new WALEdit();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          byte [] family = Bytes.toBytes("column");<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          byte [] qualifier = Bytes.toBytes(Integer.toString(j));<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          byte [] column = Bytes.toBytes("column:" + Integer.toString(j));<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          edit.add(new KeyValue(rowName, family, qualifier,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>              System.currentTimeMillis(), column));<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          LOG.info("Region " + i + ": " + edit);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          WALKeyImpl walKey =  new WALKeyImpl(infos[i].getEncodedNameAsBytes(), tableName,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>              System.currentTimeMillis(), mvcc, scopes);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          log.append(infos[i], walKey, edit, true);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          walKey.getWriteEntry();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        log.sync();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        log.rollWriter(true);<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>    wals.shutdown();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    // The below calculation of logDir relies on insider information... WALSplitter should be connected better<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // with the WAL system.... not requiring explicit path. The oldLogDir is just made up not used.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    Path logDir =<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        new Path(new Path(hbaseWALDir, HConstants.HREGION_LOGDIR_NAME),<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            this.currentServername.toString());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    Path oldLogDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    List&lt;Path&gt; splits = WALSplitter.split(hbaseWALDir, logDir, oldLogDir, fs, conf, wals);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    verifySplits(splits, howmany);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test new HDFS-265 sync.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @throws Exception<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  @Test<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public void Broken_testSync() throws Exception {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // First verify that using streams all works.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    Path p = new Path(dir, currentTest.getMethodName() + ".fsdos");<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    FSDataOutputStream out = fs.create(p);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    out.write(tableName.getName());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    Method syncMethod = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    try {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      syncMethod = out.getClass().getMethod("hflush", new Class&lt;?&gt; []{});<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } catch (NoSuchMethodException e) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      try {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        syncMethod = out.getClass().getMethod("sync", new Class&lt;?&gt; []{});<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      } catch (NoSuchMethodException ex) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        fail("This version of Hadoop supports neither Syncable.sync() " +<a name="line.248"></a>
+<span class="sourceLineNo">249</span>            "nor Syncable.hflush().");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    syncMethod.invoke(out, new Object[]{});<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    FSDataInputStream in = fs.open(p);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    assertTrue(in.available() &gt; 0);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    byte [] buffer = new byte [1024];<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    int read = in.read(buffer);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    assertEquals(tableName.getName().length, read);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    out.close();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    in.close();<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    final int total = 20;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    WAL.Reader reader = null;<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      RegionInfo info = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      scopes.put(tableName.getName(), 0);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      final WAL wal = wals.getWAL(info);<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>      for (int i = 0; i &lt; total; i++) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        WALEdit kvs = new WALEdit();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      // Now call sync and try reading.  Opening a Reader before you sync just<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      // gives you EOFE.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      wal.sync();<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // Open a Reader.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      reader = wals.createReader(fs, walPath);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      int count = 0;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      WAL.Entry entry = new WAL.Entry();<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      while ((entry = reader.next(entry)) != null) count++;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      assertEquals(total, count);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      reader.close();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // Add test that checks to see that an open of a Reader works on a file<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      // that has had a sync done on it.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      for (int i = 0; i &lt; total; i++) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        WALEdit kvs = new WALEdit();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      wal.sync();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      reader = wals.createReader(fs, walPath);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      count = 0;<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      assertTrue(count &gt;= total);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      reader.close();<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      // If I sync, should see double the edits.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      wal.sync();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      reader = wals.createReader(fs, walPath);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      count = 0;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      assertEquals(total * 2, count);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      reader.close();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      // Now do a test that ensures stuff works when we go over block boundary,<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      // especially that we return good length on file.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      final byte [] value = new byte[1025 * 1024];  // Make a 1M value.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      for (int i = 0; i &lt; total; i++) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        WALEdit kvs = new WALEdit();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), value));<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.314"></a>
+<span class="sourceLineNo">315</span>            System.currentTimeMillis(), mvcc, scopes), kvs,  true);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // Now I should have written out lots of blocks.  Sync then read.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      wal.sync();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      reader = wals.createReader(fs, walPath);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      count = 0;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      assertEquals(total * 3, count);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      reader.close();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // shutdown and ensure that Reader gets right length also.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      wal.shutdown();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      reader = wals.createReader(fs, walPath);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      count = 0;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      assertEquals(total * 3, count);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      reader.close();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    } finally {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      if (reader != null) reader.close();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<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>  private void verifySplits(final List&lt;Path&gt; splits, final int howmany)<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    assertEquals(howmany * howmany, splits.size());<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    for (int i = 0; i &lt; splits.size(); i++) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      LOG.info("Verifying=" + splits.get(i));<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      WAL.Reader reader = wals.createReader(fs, splits.get(i));<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        int count = 0;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        String previousRegion = null;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        long seqno = -1;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        WAL.Entry entry = new WAL.Entry();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        while((entry = reader.next(entry)) != null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          WALKey key = entry.getKey();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          String region = Bytes.toString(key.getEncodedRegionName());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>          // Assert that all edits are for same region.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          if (previousRegion != null) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>            assertEquals(previousRegion, region);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>          }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>          LOG.info("oldseqno=" + seqno + ", newseqno=" + key.getSequenceId());<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          assertTrue(seqno &lt; key.getSequenceId());<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          seqno = key.getSequenceId();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          previousRegion = region;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          count++;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        assertEquals(howmany, count);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      } finally {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        reader.close();<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><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /*<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * We pass different values to recoverFileLease() so that different code paths are covered<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   *<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * For this test to pass, requires:<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * 1. HDFS-200 (append support)<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * 2. HDFS-988 (SafeMode should freeze file operations<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   *              [FSNamesystem.nextGenerationStampForBlock])<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * 3. HDFS-142 (on restart, maintain pendingCreates)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAppendClose() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    TableName tableName =<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        TableName.valueOf(currentTest.getMethodName());<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    RegionInfo regionInfo = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    WAL wal = wals.getWAL(regionInfo);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    int total = 20;<a name="line.383"></a>
+<span class="sourceLineNo">384</span><a name="line.384"></a>
+<span class="sourceLineNo">385</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    scopes.put(tableName.getName(), 0);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    for (int i = 0; i &lt; total; i++) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      WALEdit kvs = new WALEdit();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      wal.append(regionInfo, new WALKeyImpl(regionInfo.getEncodedNameAsBytes(), tableName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          System.currentTimeMillis(), mvcc, scopes),<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        kvs, true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    // Now call sync to send the data to HDFS datanodes<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    wal.sync();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>     int namenodePort = cluster.getNameNodePort();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    final Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Stop the cluster.  (ensure restart since we're sharing MiniDFSCluster)<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    try {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      DistributedFileSystem dfs = cluster.getFileSystem();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      dfs.setSafeMode(HdfsConstants.SafeModeAction.SAFEMODE_ENTER);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      TEST_UTIL.shutdownMiniDFSCluster();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      try {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        // wal.writer.close() will throw an exception,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        // but still call this since it closes the LogSyncer thread first<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        wal.shutdown();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      } catch (IOException e) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        LOG.info(e.toString(), e);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      fs.close(); // closing FS last so DFSOutputStream can't call close<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      LOG.info("STOPPED first instance of the cluster");<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    } finally {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      // Restart the cluster<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      while (cluster.isClusterUp()){<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        LOG.error("Waiting for cluster to go down");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        Thread.sleep(1000);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      assertFalse(cluster.isClusterUp());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      cluster = null;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      for (int i = 0; i &lt; 100; i++) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        try {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          cluster = TEST_UTIL.startMiniDFSClusterForTestWAL(namenodePort);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          break;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        } catch (BindException e) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          LOG.info("Sleeping.  BindException bringing up new cluster");<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          Threads.sleep(1000);<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>      cluster.waitActive();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      fs = cluster.getFileSystem();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      LOG.info("STARTED second instance.");<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>    // set the lease period to be 1 second so that the<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // namenode triggers lease recovery upon append request<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    Method setLeasePeriod = cluster.getClass()<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      .getDeclaredMethod("setLeasePeriod", new Class[]{Long.TYPE, Long.TYPE});<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    setLeasePeriod.setAccessible(true);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    setLeasePeriod.invoke(cluster, 1000L, 1000L);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    try {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      Thread.sleep(1000);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    } catch (InterruptedException e) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      LOG.info(e.toString(), e);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    // Now try recovering the log, like the HMaster would do<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    final FileSystem recoveredFs = fs;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    final Configuration rlConf = conf;<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    class RecoverLogThread extends Thread {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      public Exception exception = null;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      public void run() {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          try {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            FSUtils.getInstance(fs, rlConf)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>              .recoverFileLease(recoveredFs, walPath, rlConf, null);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (IOException e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            exception = e;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>    RecoverLogThread t = new RecoverLogThread();<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    t.start();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    // Timeout after 60 sec. Without correct patches, would be an infinite loop<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    t.join(60 * 1000);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    if(t.isAlive()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      t.interrupt();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      throw new Exception("Timed out waiting for WAL.recoverLog()");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    if (t.exception != null)<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      throw t.exception;<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Make sure you can read all the content<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    WAL.Reader reader = wals.createReader(fs, walPath);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int count = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    WAL.Entry entry = new WAL.Entry();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    while (reader.next(entry) != null) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      count++;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      assertTrue("Should be one KeyValue per WALEdit",<a name="line.483"></a>
-<span class="sourceLineNo">484</span>                  entry.getEdit().getCells().size() == 1);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    assertEquals(total, count);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    reader.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Reset the lease period<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    setLeasePeriod.invoke(cluster, new Object[]{ 60000L, 3600000L });<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>  /**<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Tests that we can write out an edit, close, and then read it back in again.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  @Test<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public void testEditAdd() throws IOException {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    int colCount = 10;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    TableDescriptor htd =<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        TableDescriptorBuilder.newBuilder(TableName.valueOf(currentTest.getMethodName()))<a name="line.500"></a>
-<span class="sourceLineNo">501</span>            .setColumnFamily(ColumnFamilyDescriptorBuilder.of("column")).build();<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;byte[], Integer&gt;(Bytes.BYTES_COMPARATOR);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    for (byte[] fam : htd.getColumnFamilyNames()) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      scopes.put(fam, 0);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    byte[] row = Bytes.toBytes("row");<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    WAL.Reader reader = null;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    try {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>      // Write columns named 1, 2, 3, etc. and then values of single byte<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // 1, 2, 3...<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      long timestamp = System.currentTimeMillis();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      WALEdit cols = new WALEdit();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      for (int i = 0; i &lt; colCount; i++) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        cols.add(new KeyValue(row, Bytes.toBytes("column"),<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            Bytes.toBytes(Integer.toString(i)),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          timestamp, new byte[] { (byte)(i + '0') }));<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      RegionInfo info = RegionInfoBuilder.newBuilder(htd.getTableName()).setStartKey(row)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setEndKey(Bytes.toBytes(Bytes.toString(row) + "1")).build();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      final WAL log = wals.getWAL(info);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>      final long txid = log.append(info,<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        new WALKeyImpl(info.getEncodedNameAsBytes(), htd.getTableName(), System.currentTimeMillis(),<a name="line.525"></a>
-<span class="sourceLineNo">526</span>            mvcc, scopes),<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        cols, true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      log.sync(txid);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      log.startCacheFlush(info.getEncodedNameAsBytes(), htd.getColumnFamilyNames());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      log.completeCacheFlush(info.getEncodedNameAsBytes());<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      log.shutdown();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      Path filename = AbstractFSWALProvider.getCurrentFileName(log);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Now open a reader on the log and assert append worked.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      reader = wals.createReader(fs, filename);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      // Above we added all columns on a single row so we only read one<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // entry in the below... thats why we have '1'.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      for (int i = 0; i &lt; 1; i++) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        WAL.Entry entry = reader.next(null);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        if (entry == null) break;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        WALKey key = entry.getKey();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        WALEdit val = entry.getEdit();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        assertTrue(Bytes.equals(info.getEncodedNameAsBytes(), key.getEncodedRegionName()));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        assertTrue(htd.getTableName().equals(key.getTableName()));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Cell cell = val.getCells().get(0);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        assertTrue(Bytes.equals(row, 0, row.length, cell.getRowArray(), cell.getRowOffset(),<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          cell.getRowLength()));<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        assertEquals((byte)(i + '0'), CellUtil.cloneValue(cell)[0]);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        System.out.println(key + " " + val);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    } finally {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      if (reader != null) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        reader.close();<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><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  @Test<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  public void testAppend() throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    int colCount = 10;<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    TableDescriptor htd =<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        TableDescriptorBuilder.newBuilder(TableName.valueOf(currentTest.getMethodName()))<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            .setColumnFamily(ColumnFamilyDescriptorBuilder.of("column")).build();<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;byte[], Integer&gt;(Bytes.BYTES_COMPARATOR);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    for (byte[] fam : htd.getColumnFamilyNames()) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      scopes.put(fam, 0);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    byte[] row = Bytes.toBytes("row");<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    WAL.Reader reader = null;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    try {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      // Write columns named 1, 2, 3, etc. and then values of single byte<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      // 1, 2, 3...<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      long timestamp = System.currentTimeMillis();<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      WALEdit cols = new WALEdit();<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      for (int i = 0; i &lt; colCount; i++) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        cols.add(new KeyValue(row, Bytes.toBytes("column"),<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          Bytes.toBytes(Integer.toString(i)),<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          timestamp, new byte[] { (byte)(i + '0') }));<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      RegionInfo hri = RegionInfoBuilder.newBuilder(htd.getTableName()).build();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      final WAL log = wals.getWAL(hri);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      final long txid = log.append(hri,<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        new WALKeyImpl(hri.getEncodedNameAsBytes(), htd.getTableName(), System.currentTimeMillis(),<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            mvcc, scopes),<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        cols, true);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      log.sync(txid);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      log.startCacheFlush(hri.getEncodedNameAsBytes(), htd.getColumnFamilyNames());<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      log.completeCacheFlush(hri.getEncodedNameAsBytes());<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      log.shutdown();<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      Path filename = AbstractFSWALProvider.getCurrentFileName(log);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Now open a reader on the log and assert append worked.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      reader = wals.createReader(fs, filename);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      WAL.Entry entry = reader.next();<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      assertEquals(colCount, entry.getEdit().size());<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      int idx = 0;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      for (Cell val : entry.getEdit().getCells()) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        assertTrue(Bytes.equals(hri.getEncodedNameAsBytes(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          entry.getKey().getEncodedRegionName()));<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        assertTrue(htd.getTableName().equals(entry.getKey().getTableName()));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        assertTrue(Bytes.equals(row, 0, row.length, val.getRowArray(), val.getRowOffset(),<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          val.getRowLength()));<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        assertEquals((byte) (idx + '0'), CellUtil.cloneValue(val)[0]);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        System.out.println(entry.getKey() + " " + val);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        idx++;<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      if (reader != null) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        reader.close();<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><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  /**<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * Test that we can visit entries before they are appended<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @throws Exception<a name="line.

<TRUNCATED>

[31/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
index 794e33b..3ec9a39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
@@ -1089,640 +1089,642 @@
 <span class="sourceLineNo">1081</span>  /**<a name="line.1081"></a>
 <span class="sourceLineNo">1082</span>   * @see #retrieveFromFile(int[])<a name="line.1082"></a>
 <span class="sourceLineNo">1083</span>   */<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  private void persistToFile() throws IOException {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    assert !cacheEnabled;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    if (!ioEngine.isPersistent()) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>  }<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>   * @see #persistToFile()<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>   */<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    File persistenceFile = new File(persistencePath);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (!persistenceFile.exists()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      return;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    assert !cacheEnabled;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      byte[] pbuf = new byte[pblen];<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      int read = in.read(pbuf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      if (read != pblen) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            persistencePath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  /**<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>   * &lt;pre&gt;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   *   File f = ...<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   *     // use the input stream<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   *   } finally {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   *   }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * &lt;/pre&gt;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * @param file the file to read and delete<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @return a FileInputStream for the given file<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @throws IOException if there is a problem creating the stream<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return new FileInputStream(file) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      public void close() throws IOException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        super.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (!file.delete()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    };<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      throws IOException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (capacitySize != cacheCapacity) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>  }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span><a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>  /**<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>   * cache<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   */<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>  private void checkIOErrorIsTolerated() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        disableCache();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    } else {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      this.ioErrorStartTime = now;<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>  /**<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   */<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>  private void disableCache() {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    if (!cacheEnabled) return;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    cacheEnabled = false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    ioEngine.shutdown();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    this.scheduleThreadPool.shutdown();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    this.ramCache.clear();<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.backingMap.clear();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  private void join() throws InterruptedException {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      writerThreads[i].join();<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  @Override<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  public void shutdown() {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    disableCache();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        + "; path to write=" + persistencePath);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        join();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>        persistToFile();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      } catch (IOException ex) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      } catch (InterruptedException e) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      }<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span><a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  public CacheStats getStats() {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    return cacheStats;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>  public BucketAllocator getAllocator() {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    return this.bucketAllocator;<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>  @Override<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public long heapSize() {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    return this.heapSize.sum();<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public long size() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return this.realCacheSize.sum();<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  @Override<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  public long getCurrentDataSize() {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    return size();<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  }<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>  @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>  public long getFreeSize() {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return this.bucketAllocator.getFreeSize();<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  public long getBlockCount() {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    return this.blockNumber.sum();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>  @Override<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  public long getDataBlockCount() {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    return getBlockCount();<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>  }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  @Override<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  public long getCurrentSize() {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    return this.bucketAllocator.getUsedSize();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  }<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>   * Evicts all blocks for a specific HFile.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * &lt;p&gt;<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   *<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * @return the number of blocks evicted<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    int numEvicted = 0;<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    for (BlockCacheKey key : keySet) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      if (evictBlock(key)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          ++numEvicted;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    return numEvicted;<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>  /**<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>   */<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  static class BucketEntry implements Serializable {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // access counter comparator, descending order<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    private int offsetBase;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    private int length;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private byte offset1;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    /**<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>     */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    byte deserialiserIndex;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    private volatile long accessCounter;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    private BlockPriority priority;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>     */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    private final long cachedTime = System.nanoTime();<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      setOffset(offset);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      this.length = length;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      this.accessCounter = accessCounter;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      if (inMemory) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        this.priority = BlockPriority.MEMORY;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.SINGLE;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    long offset() { // Java has no unsigned numbers<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return o &lt;&lt; 8;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private void setOffset(long value) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      assert (value &amp; 0xFF) == 0;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      value &gt;&gt;= 8;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      offsetBase = (int) value;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    public int getLength() {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return length;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span><a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<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>    public long getAccessCounter() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      return accessCounter;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span><a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    /**<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>     * Block has been accessed. Update its local access counter.<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>     */<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    public void access(long accessCounter) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      this.accessCounter = accessCounter;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        this.priority = BlockPriority.MULTI;<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><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    public BlockPriority getPriority() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return this.priority;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    public long getCachedTime() {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      return cachedTime;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    protected int getRefCount() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return 0;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    protected int incrementRefCountAndGet() {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      return 0;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span><a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    protected int decrementRefCountAndGet() {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    protected boolean isMarkedForEvict() {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      return false;<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    protected void markForEvict() {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      // noop;<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  static class SharedMemoryBucketEntry extends BucketEntry {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    private static final long serialVersionUID = -2187147283772338481L;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Set this when we were not able to forcefully evict the block<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    private volatile boolean markedForEvict;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    private AtomicInteger refCount = new AtomicInteger(0);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    SharedMemoryBucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      super(offset, length, accessCounter, inMemory);<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    @Override<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    protected int getRefCount() {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      return this.refCount.get();<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    @Override<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    protected int incrementRefCountAndGet() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      return this.refCount.incrementAndGet();<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>    @Override<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    protected int decrementRefCountAndGet() {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      return this.refCount.decrementAndGet();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    @Override<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    protected boolean isMarkedForEvict() {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      return this.markedForEvict;<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    @Override<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    protected void markForEvict() {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      this.markedForEvict = true;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  /**<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   * according to configuration parameters and their relative sizes.<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   */<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  private class BucketEntryGroup {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    private CachedEntryQueue queue;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    private long totalSize = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    private long bucketSize;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      this.bucketSize = bucketSize;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      totalSize = 0;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span><a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      totalSize += block.getValue().getLength();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      queue.add(block);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    public long free(long toFree) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>      long freedBytes = 0;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        if (evictBlock(entry.getKey(), false)) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          freedBytes += entry.getValue().getLength();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        }<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (freedBytes &gt;= toFree) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          return freedBytes;<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      }<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      return freedBytes;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    public long overflow() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      return totalSize - bucketSize;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span><a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    public long totalSize() {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      return totalSize;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span><a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  /**<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>   */<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  @VisibleForTesting<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>  static class RAMQueueEntry {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private BlockCacheKey key;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    private Cacheable data;<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    private long accessCounter;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    private boolean inMemory;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    public RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        boolean inMemory) {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>      this.key = bck;<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      this.data = data;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      this.accessCounter = accessCounter;<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>      this.inMemory = inMemory;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    public Cacheable getData() {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      return data;<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span><a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    public BlockCacheKey getKey() {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return key;<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    public void access(long accessCounter) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      this.accessCounter = accessCounter;<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    public BucketEntry writeToCache(final IOEngine ioEngine,<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        final BucketAllocator bucketAllocator,<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>        final LongAdder realCacheSize) throws CacheFullException, IOException,<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        BucketAllocatorException {<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      int len = data.getSerializedLength();<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      // This cacheable thing can't be serialized<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      if (len == 0) return null;<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      long offset = bucketAllocator.allocateBlock(len);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      BucketEntry bucketEntry = ioEngine.usesSharedMemory()<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>          ? UnsafeAvailChecker.isAvailable()<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>              ? new UnsafeSharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>              : new SharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          : new BucketEntry(offset, len, accessCounter, inMemory);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      bucketEntry.setDeserialiserReference(data.getDeserializer());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      try {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>        if (data instanceof HFileBlock) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>          HFileBlock block = (HFileBlock)data;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          if (LOG.isTraceEnabled()) {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>            LOG.trace("Write offset=" + offset + ", len=" + len);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>          }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>          ioEngine.write(sliceBuf, offset);<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>        } else {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>          data.serialize(bb, true);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>          ioEngine.write(bb, offset);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      } catch (IOException ioe) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        // free it in bucket allocator<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>        bucketAllocator.freeBlock(offset);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw ioe;<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      realCacheSize.add(len);<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      return bucketEntry;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    }<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  /**<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * Only used in test<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @throws InterruptedException<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   */<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      writerThread.disableWriter();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      writerThread.interrupt();<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      writerThread.join();<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>  }<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span><a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        this.backingMap.entrySet().iterator();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      private final long now = System.nanoTime();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      @Override<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      public boolean hasNext() {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>        return i.hasNext();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      @Override<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      public CachedBlock next() {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>        return new CachedBlock() {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>          @Override<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>          public String toString() {<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>            return BlockCacheUtil.toString(this, now);<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>          public BlockPriority getBlockPriority() {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            return e.getValue().getPriority();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>          }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          @Override<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>          public BlockType getBlockType() {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return null;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public long getOffset() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().getOffset();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public long getSize() {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            return e.getValue().getLength();<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          }<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>          @Override<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>          public long getCachedTime() {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            return e.getValue().getCachedTime();<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          public String getFilename() {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>            return e.getKey().getHfileName();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>          public int compareTo(CachedBlock other) {<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>            if (diff != 0) return diff;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span><a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            if (diff != 0) return diff;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>                other.getCachedTime());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>            }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span><a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          @Override<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>          public int hashCode() {<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            return e.getKey().hashCode();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          }<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>          @Override<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          public boolean equals(Object obj) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            if (obj instanceof CachedBlock) {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              return compareTo(cb) == 0;<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            } else {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>              return false;<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>            }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        };<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>      }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      @Override<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>      public void remove() {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>        throw new UnsupportedOperationException();<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>      }<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>    };<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  }<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  @Override<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  public BlockCache[] getBlockCaches() {<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    return null;<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span><a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  @Override<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    if (block.getMemoryType() == MemoryType.SHARED) {<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>      BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      if (bucketEntry != null) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>        int refCount = bucketEntry.decrementRefCountAndGet();<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        if (refCount == 0 &amp;&amp; bucketEntry.isMarkedForEvict()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          forceEvict(cacheKey);<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      }<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>  @VisibleForTesting<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>    if (bucketEntry != null) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      return bucketEntry.getRefCount();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    }<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    return 0;<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span><a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>  float getAcceptableFactor() {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    return acceptableFactor;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span><a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>  float getMinFactor() {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    return minFactor;<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>  float getExtraFreeFactor() {<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    return extraFreeFactor;<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>  }<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span><a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>  float getSingleFactor() {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    return singleFactor;<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  float getMultiFactor() {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    return multiFactor;<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>  }<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  float getMemoryFactor() {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    return memoryFactor;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>}<a name="line.1717"></a>
+<span class="sourceLineNo">1084</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  private void persistToFile() throws IOException {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    assert !cacheEnabled;<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>    if (!ioEngine.isPersistent()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<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>   * @see #persistToFile()<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   */<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    File persistenceFile = new File(persistencePath);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    if (!persistenceFile.exists()) {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    assert !cacheEnabled;<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      byte[] pbuf = new byte[pblen];<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      int read = in.read(pbuf);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      if (read != pblen) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            persistencePath);<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  /**<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>   * &lt;pre&gt;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>   *   File f = ...<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   *     // use the input stream<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   *   } finally {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>   *   }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   * &lt;/pre&gt;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @param file the file to read and delete<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>   * @return a FileInputStream for the given file<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>   * @throws IOException if there is a problem creating the stream<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>   */<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    return new FileInputStream(file) {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      public void close() throws IOException {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>        super.close();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>        if (!file.delete()) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>        }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    };<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>      throws IOException {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    if (capacitySize != cacheCapacity) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>          + ", expected:" + backingMap.getClass().getName());<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>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  /**<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * cache<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private void checkIOErrorIsTolerated() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        disableCache();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    } else {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      this.ioErrorStartTime = now;<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>    }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>  }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  private void disableCache() {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!cacheEnabled) return;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    cacheEnabled = false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    ioEngine.shutdown();<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.scheduleThreadPool.shutdown();<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    this.ramCache.clear();<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      this.backingMap.clear();<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>  }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>  private void join() throws InterruptedException {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      writerThreads[i].join();<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  public void shutdown() {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    disableCache();<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        + "; path to write=" + persistencePath);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      try {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>        join();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>        persistToFile();<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      } catch (IOException ex) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      } catch (InterruptedException e) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public CacheStats getStats() {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return cacheStats;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  public BucketAllocator getAllocator() {<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    return this.bucketAllocator;<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>  @Override<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  public long heapSize() {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    return this.heapSize.sum();<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  @Override<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public long size() {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    return this.realCacheSize.sum();<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  @Override<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>  public long getCurrentDataSize() {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    return size();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>  }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  public long getFreeSize() {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    return this.bucketAllocator.getFreeSize();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span><a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  @Override<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  public long getBlockCount() {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    return this.blockNumber.sum();<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>  @Override<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  public long getDataBlockCount() {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    return getBlockCount();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  public long getCurrentSize() {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    return this.bucketAllocator.getUsedSize();<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>  }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span><a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>  /**<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * Evicts all blocks for a specific HFile.<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * &lt;p&gt;<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   *<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>   * @return the number of blocks evicted<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span><a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    int numEvicted = 0;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    for (BlockCacheKey key : keySet) {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (evictBlock(key)) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>          ++numEvicted;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span><a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    return numEvicted;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>  }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>  /**<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   */<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  static class BucketEntry implements Serializable {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    // access counter comparator, descending order<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span><a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private int offsetBase;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private int length;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private byte offset1;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span><a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    /**<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>     */<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    byte deserialiserIndex;<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    private volatile long accessCounter;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    private BlockPriority priority;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span><a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    /**<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>     */<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    private final long cachedTime = System.nanoTime();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      setOffset(offset);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.length = length;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      this.accessCounter = accessCounter;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      if (inMemory) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.MEMORY;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      } else {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        this.priority = BlockPriority.SINGLE;<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    long offset() { // Java has no unsigned numbers<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      return o &lt;&lt; 8;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    private void setOffset(long value) {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      assert (value &amp; 0xFF) == 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      value &gt;&gt;= 8;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      offsetBase = (int) value;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    public int getLength() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return length;<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>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span><a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    public long getAccessCounter() {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      return accessCounter;<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    }<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span><a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    /**<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>     * Block has been accessed. Update its local access counter.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     */<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    public void access(long accessCounter) {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      this.accessCounter = accessCounter;<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        this.priority = BlockPriority.MULTI;<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    public BlockPriority getPriority() {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      return this.priority;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    public long getCachedTime() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      return cachedTime;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    protected int getRefCount() {<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      return 0;<a name="line.1390

<TRUNCATED>

[38/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
index beb9b08..a54f4f6 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
@@ -1730,7 +1730,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>persistToFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1084">persistToFile</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1086">persistToFile</a>()
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1746,7 +1746,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>retrieveFromFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1098">retrieveFromFile</a>(int[]&nbsp;bucketSizes)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1100">retrieveFromFile</a>(int[]&nbsp;bucketSizes)
                        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>
@@ -1762,7 +1762,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteFileOnClose</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html?is-external=true" title="class or interface in java.io">FileInputStream</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1139">deleteFileOnClose</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/File.html?is-external=true" title="class or interface in java.io">File</a>&nbsp;file)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html?is-external=true" title="class or interface in java.io">FileInputStream</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1141">deleteFileOnClose</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/File.html?is-external=true" title="class or interface in java.io">File</a>&nbsp;file)
                                    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">Create an input stream that deletes the file after reading it. Use in try-with-resources to
  avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:
@@ -1790,7 +1790,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyCapacityAndClasses</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1151">verifyCapacityAndClasses</a>(long&nbsp;capacitySize,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1153">verifyCapacityAndClasses</a>(long&nbsp;capacitySize,
                                       <a href="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;ioclass,
                                       <a href="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;mapclass)
                                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>
@@ -1806,7 +1806,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>parsePB</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1168">parsePB</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.BucketCacheProtos.BucketCacheEntry&nbsp;proto)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1170">parsePB</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.BucketCacheProtos.BucketCacheEntry&nbsp;proto)
               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>
@@ -1820,7 +1820,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>checkIOErrorIsTolerated</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1178">checkIOErrorIsTolerated</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1180">checkIOErrorIsTolerated</a>()</pre>
 <div class="block">Check whether we tolerate IO error this time. If the duration of IOEngine
  throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the
  cache</div>
@@ -1832,7 +1832,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>disableCache</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1194">disableCache</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1196">disableCache</a>()</pre>
 <div class="block">Used to shut down the cache -or- turn it off in the case of something broken.</div>
 </li>
 </ul>
@@ -1842,7 +1842,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1207">join</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1209">join</a>()
            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>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1856,7 +1856,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1213">shutdown</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1215">shutdown</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#shutdown--">BlockCache</a></code></span></div>
 <div class="block">Shutdown the cache.</div>
 <dl>
@@ -1871,7 +1871,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getStats</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1230">getStats</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1232">getStats</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getStats--">BlockCache</a></code></span></div>
 <div class="block">Get the statistics for this block cache.</div>
 <dl>
@@ -1888,7 +1888,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllocator</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocator</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1234">getAllocator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocator</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1236">getAllocator</a>()</pre>
 </li>
 </ul>
 <a name="heapSize--">
@@ -1897,7 +1897,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1239">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1241">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/HeapSize.html#heapSize--">heapSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></code></dd>
@@ -1913,7 +1913,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1244">size</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1246">size</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#size--">BlockCache</a></code></span></div>
 <div class="block">Returns the total size of the block cache, in bytes.</div>
 <dl>
@@ -1930,7 +1930,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentDataSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1249">getCurrentDataSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1251">getCurrentDataSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getCurrentDataSize--">BlockCache</a></code></span></div>
 <div class="block">Returns the occupied size of data blocks, in bytes.</div>
 <dl>
@@ -1947,7 +1947,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getFreeSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1254">getFreeSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1256">getFreeSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getFreeSize--">BlockCache</a></code></span></div>
 <div class="block">Returns the free size of the block cache, in bytes.</div>
 <dl>
@@ -1964,7 +1964,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1259">getBlockCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1261">getBlockCount</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getBlockCount--">BlockCache</a></code></span></div>
 <div class="block">Returns the number of blocks currently cached in the block cache.</div>
 <dl>
@@ -1981,7 +1981,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1264">getDataBlockCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1266">getDataBlockCount</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getDataBlockCount--">BlockCache</a></code></span></div>
 <div class="block">Returns the number of data blocks currently cached in the block cache.</div>
 <dl>
@@ -1998,7 +1998,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1269">getCurrentSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1271">getCurrentSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getCurrentSize--">BlockCache</a></code></span></div>
 <div class="block">Returns the occupied size of the block cache, in bytes.</div>
 <dl>
@@ -2015,7 +2015,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>evictBlocksByHfileName</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1281">evictBlocksByHfileName</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;hfileName)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1283">evictBlocksByHfileName</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;hfileName)</pre>
 <div class="block">Evicts all blocks for a specific HFile.
  <p>
  This is used for evict-on-close to remove all blocks of a specific HFile.</div>
@@ -2033,7 +2033,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>stopWriterThreads</h4>
-<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1568">stopWriterThreads</a>()
+<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1570">stopWriterThreads</a>()
                 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">Only used in test</div>
 <dl>
@@ -2048,7 +2048,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>iterator</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1577">iterator</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1579">iterator</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true#iterator--" title="class or interface in java.lang">iterator</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;</code></dd>
@@ -2065,7 +2065,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockCaches</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a>[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1668">getBlockCaches</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a>[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1670">getBlockCaches</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getBlockCaches--">getBlockCaches</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a></code></dd>
@@ -2080,7 +2080,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>returnBlock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1673">returnBlock</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1675">returnBlock</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey,
                         <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;block)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#returnBlock-org.apache.hadoop.hbase.io.hfile.BlockCacheKey-org.apache.hadoop.hbase.io.hfile.Cacheable-">BlockCache</a></code></span></div>
 <div class="block">Called when the scanner using the block decides to return the block once its usage
@@ -2104,7 +2104,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getRefCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1686">getRefCount</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1688">getRefCount</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey)</pre>
 </li>
 </ul>
 <a name="getAcceptableFactor--">
@@ -2113,7 +2113,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getAcceptableFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1694">getAcceptableFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1696">getAcceptableFactor</a>()</pre>
 </li>
 </ul>
 <a name="getMinFactor--">
@@ -2122,7 +2122,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getMinFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1698">getMinFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1700">getMinFactor</a>()</pre>
 </li>
 </ul>
 <a name="getExtraFreeFactor--">
@@ -2131,7 +2131,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtraFreeFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1702">getExtraFreeFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1704">getExtraFreeFactor</a>()</pre>
 </li>
 </ul>
 <a name="getSingleFactor--">
@@ -2140,7 +2140,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getSingleFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1706">getSingleFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1708">getSingleFactor</a>()</pre>
 </li>
 </ul>
 <a name="getMultiFactor--">
@@ -2149,7 +2149,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getMultiFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1710">getMultiFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1712">getMultiFactor</a>()</pre>
 </li>
 </ul>
 <a name="getMemoryFactor--">
@@ -2158,7 +2158,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMemoryFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1714">getMemoryFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1716">getMemoryFactor</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 3fe3b39..65f8385 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -274,12 +274,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/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/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/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 b08012e..427b9f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,9 +353,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.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/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/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/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 2e21581..76f6d8f 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,10 +293,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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>
-<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index abd92a9..1799704 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -198,8 +198,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.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 5ce7ce6..207a285 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.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/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/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.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/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 d3f7afa..25426ec 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/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/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 990e7f7..a1f9f29 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/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/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/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/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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/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/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/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/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/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/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/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/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 9671577..bd09b84 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/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/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/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>
 <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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 2c5f4d8..c5b39c0 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -229,13 +229,13 @@
 <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.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/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/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/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/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/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/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index 0fb0b40..1f561cf 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2248">HStore.StoreFlusherImpl</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2258">HStore.StoreFlusherImpl</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></pre>
 </li>
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tracker</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2250">tracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2260">tracker</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSeqNum">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSeqNum</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2251">cacheFlushSeqNum</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2261">cacheFlushSeqNum</a></pre>
 </li>
 </ul>
 <a name="snapshot">
@@ -297,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2252">snapshot</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2262">snapshot</a></pre>
 </li>
 </ul>
 <a name="tempFiles">
@@ -306,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tempFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2253">tempFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2263">tempFiles</a></pre>
 </li>
 </ul>
 <a name="committedFiles">
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>committedFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2254">committedFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2264">committedFiles</a></pre>
 </li>
 </ul>
 <a name="cacheFlushCount">
@@ -324,7 +324,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2255">cacheFlushCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2265">cacheFlushCount</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSize">
@@ -333,7 +333,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2256">cacheFlushSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2266">cacheFlushSize</a></pre>
 </li>
 </ul>
 <a name="outputFileSize">
@@ -342,7 +342,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>outputFileSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2257">outputFileSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2267">outputFileSize</a></pre>
 </li>
 </ul>
 </li>
@@ -359,7 +359,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StoreFlusherImpl</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2259">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2269">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
 </ul>
@@ -377,7 +377,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2269">prepare</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2279">prepare</a>()</pre>
 <div class="block">This is not thread safe. The caller should have a lock on the region or the store.
  If necessary, the lock can be added with the patch provided in HBASE-10087</div>
 <dl>
@@ -394,7 +394,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCache</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2279">flushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2289">flushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                 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/regionserver/StoreFlushContext.html#flushCache-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Flush the cache (create the new store file)
@@ -415,7 +415,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>commit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2288">commit</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2298">commit</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                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/regionserver/StoreFlushContext.html#commit-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Commit the flush - add the store file to the store and clear the
@@ -440,7 +440,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getOutputFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2331">getOutputFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2341">getOutputFileSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getOutputFileSize--">getOutputFileSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></code></dd>
@@ -455,7 +455,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getCommittedFiles</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/regionserver/HStore.StoreFlusherImpl.html#line.2336">getCommittedFiles</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;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2346">getCommittedFiles</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getCommittedFiles--">StoreFlushContext</a></code></span></div>
 <div class="block">Returns the newly committed files from the flush. Called only if commit returns true</div>
 <dl>
@@ -472,7 +472,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>replayFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2349">replayFlush</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/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;fileNames,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2359">replayFlush</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/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;fileNames,
                         boolean&nbsp;dropMemstoreSnapshot)
                  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">Similar to commit, but called in secondary region replicas for replaying the
@@ -495,7 +495,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2381">abort</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2391">abort</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">Abort the snapshot preparation. Drops the snapshot if any.</div>
 <dl>


[03/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
index a369370..295a1d4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
@@ -39,989 +39,1006 @@
 <span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.Optional;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.ServerName;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Get;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Put;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Table;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.zookeeper.KeeperException;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.After;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.junit.AfterClass;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.junit.Assert;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.junit.Before;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.junit.BeforeClass;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.junit.ClassRule;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.junit.Rule;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.junit.Test;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.junit.experimental.categories.Category;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.junit.rules.TestName;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.slf4j.Logger;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.slf4j.LoggerFactory;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * The below tests are testing split region against a running cluster<a name="line.113"></a>
-<span class="sourceLineNo">114</span> */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.115"></a>
-<span class="sourceLineNo">116</span>@SuppressWarnings("deprecation")<a name="line.116"></a>
-<span class="sourceLineNo">117</span>public class TestSplitTransactionOnCluster {<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @ClassRule<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private Admin admin = null;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private MiniHBaseCluster cluster = null;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static final int NB_SERVERS = 3;<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    new HBaseTestingUtility();<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  @Rule<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  public TestName name = new TestName();<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @BeforeClass public static void before() throws Exception {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  @AfterClass public static void after() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TESTING_UTIL.shutdownMiniCluster();<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>  @Before public void setup() throws IOException {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  @After<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  public void tearDown() throws Exception {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    this.admin.close();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      TESTING_UTIL.deleteTable(htd.getTableName());<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>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throws IOException, InterruptedException {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(1, regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    try {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchProcedureException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return hri;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private void requestSplitRegion(<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      final HRegionServer rsServer,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      final Region region,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      final byte[] midKey) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testRITStateForRollback() throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    final HMaster master = cluster.getMaster();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      // Create table then get the single region for our new table.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      insertData(tableName, admin, t);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      t.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      this.admin.setBalancerRunning(false, true);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      master.setCatalogJanitorEnabled(false);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // find a splittable region<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      final HRegion region = findSplittableRegion(regions);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // install master co-processor to fail splits<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      master.getMasterCoprocessorHost().load(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        FailingSplitMasterObserver.class,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        Coprocessor.PRIORITY_USER,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        master.getConfiguration());<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // split async<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      FailingSplitMasterObserver observer =<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      assertNotNull(observer);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      observer.latch.await();<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        Threads.sleep(100);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      admin.setBalancerRunning(true, false);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      master.setCatalogJanitorEnabled(true);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      abortAndWaitForMaster();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      TESTING_UTIL.deleteTable(tableName);<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  @Test<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // Create table then get the single region for our new table.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    admin.createTable(htd);<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Thread.sleep(100);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    HStore store = region.getStore(cf);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // insert data<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    insertData(tableName, admin, t);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    insertData(tableName, admin, t);<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int fileNum = store.getStorefiles().size();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // 0, Compaction Request<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    store.triggerMajorCompaction();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertTrue(cc.isPresent());<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // 1, A timeout split<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    // 1.1 close region<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // 1.2 rollback and Region initialize again<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    region.initialize();<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // 2, Run Compaction cc<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // 3, Split<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    volatile CountDownLatch latch;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      latch = new CountDownLatch(1);<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>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return Optional.of(this);<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>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void preSplitRegionBeforeMETAAction(<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        final byte[] splitKey,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      latch.countDown();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      throw new IOException("Causing rollback of region split");<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><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  @Test<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    // Create table then get the single region for our new table.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.305"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.conf.Configuration;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.FileSystem;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.fs.Path;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.ServerName;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Get;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Put;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Result;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Table;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.zookeeper.KeeperException;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.junit.After;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.junit.AfterClass;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.junit.Assert;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.junit.Before;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.junit.BeforeClass;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.junit.ClassRule;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.junit.Rule;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.junit.Test;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.junit.experimental.categories.Category;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.junit.rules.TestName;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.slf4j.Logger;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.slf4j.LoggerFactory;<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> * The below tests are testing split region against a running cluster<a name="line.115"></a>
+<span class="sourceLineNo">116</span> */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.117"></a>
+<span class="sourceLineNo">118</span>@SuppressWarnings("deprecation")<a name="line.118"></a>
+<span class="sourceLineNo">119</span>public class TestSplitTransactionOnCluster {<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  @ClassRule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private Admin admin = null;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private MiniHBaseCluster cluster = null;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static final int NB_SERVERS = 3;<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    new HBaseTestingUtility();<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Rule<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public TestName name = new TestName();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @BeforeClass public static void before() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @AfterClass public static void after() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    TESTING_UTIL.shutdownMiniCluster();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Before public void setup() throws IOException {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @After<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public void tearDown() throws Exception {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    this.admin.close();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      TESTING_UTIL.deleteTable(htd.getTableName());<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      throws IOException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertEquals(1, regions.size());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    try {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    } catch (NoSuchProcedureException e) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return hri;<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>  private void requestSplitRegion(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      final HRegionServer rsServer,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      final Region region,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      final byte[] midKey) throws IOException {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<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>  @Test<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  public void testRITStateForRollback() throws Exception {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    final HMaster master = cluster.getMaster();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      // Create table then get the single region for our new table.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      insertData(tableName, admin, t);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      t.close();<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      this.admin.setBalancerRunning(false, true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      master.setCatalogJanitorEnabled(false);<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // find a splittable region<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      final HRegion region = findSplittableRegion(regions);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>      // install master co-processor to fail splits<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      master.getMasterCoprocessorHost().load(<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        FailingSplitMasterObserver.class,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        Coprocessor.PRIORITY_USER,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        master.getConfiguration());<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // split async<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FailingSplitMasterObserver observer =<a name="line.213"></a>
+<span class="sourceLineNo">214</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      assertNotNull(observer);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      observer.latch.await();<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        Threads.sleep(100);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } finally {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      admin.setBalancerRunning(true, false);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      master.setCatalogJanitorEnabled(true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      abortAndWaitForMaster();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      TESTING_UTIL.deleteTable(tableName);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  @Test<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // Create table then get the single region for our new table.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    admin.createTable(htd);<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      Thread.sleep(100);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    HStore store = region.getStore(cf);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // insert data<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    insertData(tableName, admin, t);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    insertData(tableName, admin, t);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    int fileNum = store.getStorefiles().size();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // 0, Compaction Request<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    store.triggerMajorCompaction();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    assertTrue(cc.isPresent());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // 1, A timeout split<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // 1.1 close region<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // 1.2 rollback and Region initialize again<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    region.initialize();<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // 2, Run Compaction cc<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // 3, Split<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    volatile CountDownLatch latch;<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    @Override<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      latch = new CountDownLatch(1);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return Optional.of(this);<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>    @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    public void preSplitRegionBeforeMETAAction(<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        final byte[] splitKey,<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      latch.countDown();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      throw new IOException("Causing rollback of region split");<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // Create table then get the single region for our new table.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.305"></a>
 <span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.307"></a>
+<span class="sourceLineNo">307</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.307"></a>
 <span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.admin.setBalancerRunning(false, true);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // Add a bit of load up into the table so splittable.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Get region pre-split.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      printOutRegions(server, "Initial regions: ");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // rollback.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // split transaction. Catch the exception instead.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      try {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        fail();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      } catch (DoNotRetryRegionException e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        // Expected<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Wait around a while and assert count of regions remains constant.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        Thread.sleep(100);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // Now try splitting and it should work.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      split(hri, server, regionCount);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      // Get daughters<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      checkAndGetDaughters(tableName);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      // OK, so split happened after we cleared the blocking node.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    } finally {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      admin.setBalancerRunning(true, false);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      t.close();<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><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @throws IOException<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @throws InterruptedException<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  @Test<a name="line.356"></a>
-<span class="sourceLineNo">357</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Create table then get the single region for our new table.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.365"></a>
+<span class="sourceLineNo">309</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    this.admin.setBalancerRunning(false, true);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Add a bit of load up into the table so splittable.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // Get region pre-split.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      printOutRegions(server, "Initial regions: ");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // rollback.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      // split transaction. Catch the exception instead.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        fail();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      } catch (DoNotRetryRegionException e) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        // Expected<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // Wait around a while and assert count of regions remains constant.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        Thread.sleep(100);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      // Now try splitting and it should work.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      split(hri, server, regionCount);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      // Get daughters<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      checkAndGetDaughters(tableName);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      // OK, so split happened after we cleared the blocking node.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } finally {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      admin.setBalancerRunning(true, false);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      t.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<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>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @throws IOException<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @throws InterruptedException<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  @Test<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // Create table then get the single region for our new table.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.365"></a>
 <span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    this.admin.setBalancerRunning(false, true);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    try {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      // Add a bit of load up into the table so splittable.<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Get region pre-split.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      printOutRegions(server, "Initial regions: ");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      // Now split.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      split(hri, server, regionCount);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      // Get daughters<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // Now split one of the daughters.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      RegionInfo daughter = daughters.get(0).getRegionInfo();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.info("Daughter we are going to split: " + daughter);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Compact first to ensure we have cleaned up references -- else the split<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // will fail.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      this.admin.compactRegion(daughter.getRegionName());<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      daughters = cluster.getRegions(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      HRegion daughterRegion = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      for (HRegion r: daughters) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        if (RegionInfo.COMPARATOR.compare(r.getRegionInfo(), daughter) == 0) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          daughterRegion = r;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          LOG.info("Found matching HRI: " + daughterRegion);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          break;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      assertTrue(daughterRegion != null);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      for (int i=0; i&lt;100; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        if (!daughterRegion.hasReferences()) break;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Threads.sleep(100);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      assertFalse("Waiting for reference to be compacted", daughterRegion.hasReferences());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      LOG.info("Daughter hri before split (has been compacted): " + daughter);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      split(daughter, server, regionCount);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // Get list of daughters<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      daughters = cluster.getRegions(tableName);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      for (HRegion d: daughters) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        LOG.info("Regions before crash: " + d);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Now crash the server<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      cluster.abortRegionServer(tableRegionIndex);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      waitUntilRegionServerDead();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      awaitDaughters(tableName, daughters.size());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      // Assert daughters are online and ONLY the original daughters -- that<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      // fixup didn't insert one during server shutdown recover.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      regions = cluster.getRegions(tableName);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      for (HRegion d: daughters) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        LOG.info("Regions after crash: " + d);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (daughters.size() != regions.size()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        LOG.info("Daughters=" + daughters.size() + ", regions=" + regions.size());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      assertEquals(daughters.size(), regions.size());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      for (HRegion r: regions) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        LOG.info("Regions post crash " + r + ", contains=" + daughters.contains(r));<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        assertTrue("Missing region post crash " + r, daughters.contains(r));<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      LOG.info("EXITING");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      admin.setBalancerRunning(true, false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      t.close();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @Test<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles() throws Exception {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    TableName userTableName = TableName.valueOf(name.getMethodName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    HTableDescriptor htd = new HTableDescriptor(userTableName);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    HColumnDescriptor hcd = new HColumnDescriptor("col");<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    htd.addFamily(hcd);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    admin.createTable(htd);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    Table table = TESTING_UTIL.getConnection().getTable(userTableName);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      for (int i = 0; i &lt;= 5; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        String row = "row" + i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Put p = new Put(row.getBytes());<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        String val = "Val" + i;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        p.addColumn("col".getBytes(), "ql".getBytes(), val.getBytes());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        table.put(p);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        admin.flush(userTableName);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        Delete d = new Delete(row.getBytes());<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        // Do a normal delete<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        table.delete(d);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        admin.flush(userTableName);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      admin.majorCompact(userTableName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      List&lt;RegionInfo&gt; regionsOfTable =<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          cluster.getMaster().getAssignmentManager().getRegionStates()<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          .getRegionsOfTable(userTableName);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(1, regionsOfTable.size());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      RegionInfo hRegionInfo = regionsOfTable.get(0);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      Put p = new Put("row6".getBytes());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      table.put(p);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      p = new Put("row7".getBytes());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      table.put(p);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      p = new Put("row8".getBytes());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      table.put(p);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      admin.flush(userTableName);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      admin.splitRegion(hRegionInfo.getRegionName(), "row7".getBytes());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      regionsOfTable = cluster.getMaster()<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          .getAssignmentManager().getRegionStates()<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .getRegionsOfTable(userTableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      while (regionsOfTable.size() != 2) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        Thread.sleep(1000);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        regionsOfTable = cluster.getMaster()<a name="line.481"></a>
-<span class="sourceLineNo">482</span>            .getAssignmentManager().getRegionStates()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>            .getRegionsOfTable(userTableName);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.debug("waiting 2 regions to be available, got " + regionsOfTable.size() +<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          ": " + regionsOfTable);<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>      }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      Assert.assertEquals(2, regionsOfTable.size());<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      Scan s = new Scan();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      ResultScanner scanner = table.getScanner(s);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      int mainTableCount = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        mainTableCount++;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      Assert.assertEquals(3, mainTableCount);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    } finally {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      table.close();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * Verifies HBASE-5806.  Here the case is that splitting is completed but before the<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * CJ could remove the parent region the master is killed and restarted.<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @throws IOException<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   * @throws InterruptedException<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @throws NodeExistsException<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @throws KeeperException<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  @Test<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  public void testMasterRestartAtRegionSplitPendingCatalogJanitor()<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      throws IOException, InterruptedException, NodeExistsException,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      KeeperException, ServiceException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    // Create table then get the single region for our new table.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    this.admin.setBalancerRunning(false, true);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Add a bit of load up into the table so splittable.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      // Get region pre-split.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      printOutRegions(server, "Initial regions: ");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Call split.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      this.admin.splitRegion(hri.getRegionName());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // Before cleanup, get a new master.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      HMaster master = abortAndWaitForMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      // Now call compact on the daughters and clean up any references.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      for (HRegion daughter: daughters) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        daughter.compact(true);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        assertFalse(daughter.hasReferences());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      // BUT calling compact on the daughters is not enough. The CatalogJanitor looks<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      // in the filesystem, and the filesystem content is not same as what the Region<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      // is reading from. Compacted-away files are picked up later by the compacted<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      // file discharger process. It runs infrequently. Make it run so CatalogJanitor<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      // doens't find any references.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      for (RegionServerThread rst: cluster.getRegionServerThreads()) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>        boolean oldSetting = rst.getRegionServer().compactedFileDischarger.setUseExecutor(false);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        rst.getRegionServer().compactedFileDischarger.run();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        rst.getRegionServer().compactedFileDischarger.setUseExecutor(oldSetting);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      LOG.info("Starting run of CatalogJanitor");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      cluster.getMaster().getCatalogJanitor().run();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      ProcedureTestingUtility.waitAllProcedures(cluster.getMaster().getMasterProcedureExecutor());<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      RegionStates regionStates = master.getAssignmentManager().getRe

<TRUNCATED>

[12/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
index 2baed41..1b43a88 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
@@ -146,111 +146,178 @@
 <span class="sourceLineNo">138</span>  }<a name="line.138"></a>
 <span class="sourceLineNo">139</span><a name="line.139"></a>
 <span class="sourceLineNo">140</span>  @Test<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public void testNamespaceSpaceQuotaRemoved() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">141</span>  public void testTableSpaceAndRPCQuotaRemoved() throws Exception {<a name="line.141"></a>
 <span class="sourceLineNo">142</span>    final Connection conn = TEST_UTIL.getConnection();<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    final Admin admin = conn.getAdmin();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    final String ns = testName.getMethodName();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // Drop the ns if it somehow exists<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    if (namespaceExists(ns)) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      admin.deleteNamespace(ns);<a name="line.147"></a>
+<span class="sourceLineNo">144</span>    final TableName tn = TableName.valueOf(testName.getMethodName());<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // Drop the table if it somehow exists<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    if (admin.tableExists(tn)) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      dropTable(admin, tn);<a name="line.147"></a>
 <span class="sourceLineNo">148</span>    }<a name="line.148"></a>
 <span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    // Create the ns<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    admin.createNamespace(desc);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    assertEquals(0, getNumSpaceQuotas());<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    // Set a quota<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    QuotaSettings settings = QuotaSettingsFactory.limitNamespaceSpace(<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        ns, 1024L, SpaceViolationPolicy.NO_INSERTS);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    admin.setQuota(settings);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    assertEquals(1, getNumSpaceQuotas());<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>    // Delete the namespace and observe the quota being automatically deleted as well<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    admin.deleteNamespace(ns);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    assertEquals(0, getNumSpaceQuotas());<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">150</span>    createTable(admin, tn);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, getNumSpaceQuotas());<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    assertEquals(0, getThrottleQuotas());<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    // Set Both quotas<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    QuotaSettings settings =<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        QuotaSettingsFactory.limitTableSpace(tn, 1024L, SpaceViolationPolicy.NO_INSERTS);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    admin.setQuota(settings);<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    settings =<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        QuotaSettingsFactory.throttleTable(tn, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    admin.setQuota(settings);<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    assertEquals(1, getNumSpaceQuotas());<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    assertEquals(1, getThrottleQuotas());<a name="line.164"></a>
 <span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  @Test<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  public void testNamespaceRPCQuotaRemoved() throws Exception {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    final Connection conn = TEST_UTIL.getConnection();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    final Admin admin = conn.getAdmin();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    final String ns = testName.getMethodName();<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    // Drop the ns if it somehow exists<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    if (namespaceExists(ns)) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      admin.deleteNamespace(ns);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // Create the ns<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    admin.createNamespace(desc);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    assertEquals(0, getThrottleQuotas());<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // Set a quota<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    QuotaSettings settings =<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        QuotaSettingsFactory.throttleNamespace(ns, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    admin.setQuota(settings);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    assertEquals(1, getThrottleQuotas());<a name="line.185"></a>
+<span class="sourceLineNo">166</span>    // Delete the table and observe the quotas being automatically deleted as well<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    dropTable(admin, tn);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    assertEquals(0, getNumSpaceQuotas());<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    assertEquals(0, getThrottleQuotas());<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>  @Test<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public void testNamespaceSpaceQuotaRemoved() throws Exception {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    final Connection conn = TEST_UTIL.getConnection();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    final Admin admin = conn.getAdmin();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    final String ns = testName.getMethodName();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // Drop the ns if it somehow exists<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    if (namespaceExists(ns)) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      admin.deleteNamespace(ns);<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>    // Create the ns<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    admin.createNamespace(desc);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertEquals(0, getNumSpaceQuotas());<a name="line.185"></a>
 <span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    // Delete the namespace and observe the quota being automatically deleted as well<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    admin.deleteNamespace(ns);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    assertEquals(0, getThrottleQuotas());<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>  @Test<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  public void testObserverAddedByDefault() throws Exception {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    final HMaster master = TEST_UTIL.getHBaseCluster().getMaster();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    final MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    Set&lt;String&gt; coprocessorNames = cpHost.getCoprocessors();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    assertTrue(<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        "Did not find MasterQuotasObserver in list of CPs: " + coprocessorNames,<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        coprocessorNames.contains(MasterQuotasObserver.class.getSimpleName()));<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>  public boolean namespaceExists(String ns) throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    NamespaceDescriptor[] descs = TEST_UTIL.getAdmin().listNamespaceDescriptors();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    for (NamespaceDescriptor desc : descs) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      if (ns.equals(desc.getName())) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return true;<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>    return false;<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>  public int getNumSpaceQuotas() throws Exception {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration());<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    int numSpaceQuotas = 0;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    for (QuotaSettings quotaSettings : scanner) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      if (quotaSettings.getQuotaType() == QuotaType.SPACE) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        numSpaceQuotas++;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    return numSpaceQuotas;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public int getThrottleQuotas() throws Exception {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration());<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    int throttleQuotas = 0;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    for (QuotaSettings quotaSettings : scanner) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      if (quotaSettings.getQuotaType() == QuotaType.THROTTLE) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        throttleQuotas++;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    return throttleQuotas;<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>  private void createTable(Admin admin, TableName tn) throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    // Create a table<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    HTableDescriptor tableDesc = new HTableDescriptor(tn);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    tableDesc.addFamily(new HColumnDescriptor("F1"));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    admin.createTable(tableDesc);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">187</span>    // Set a quota<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    QuotaSettings settings = QuotaSettingsFactory.limitNamespaceSpace(<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        ns, 1024L, SpaceViolationPolicy.NO_INSERTS);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    admin.setQuota(settings);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    assertEquals(1, getNumSpaceQuotas());<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>    // Delete the namespace and observe the quota being automatically deleted as well<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    admin.deleteNamespace(ns);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    assertEquals(0, getNumSpaceQuotas());<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>  @Test<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  public void testNamespaceRPCQuotaRemoved() throws Exception {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    final Connection conn = TEST_UTIL.getConnection();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    final Admin admin = conn.getAdmin();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    final String ns = testName.getMethodName();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // Drop the ns if it somehow exists<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (namespaceExists(ns)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      admin.deleteNamespace(ns);<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>    // Create the ns<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    admin.createNamespace(desc);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    assertEquals(0, getThrottleQuotas());<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // Set a quota<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    QuotaSettings settings =<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        QuotaSettingsFactory.throttleNamespace(ns, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    admin.setQuota(settings);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    assertEquals(1, getThrottleQuotas());<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    // Delete the namespace and observe the quota being automatically deleted as well<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    admin.deleteNamespace(ns);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    assertEquals(0, getThrottleQuotas());<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>  @Test<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  public void testNamespaceSpaceAndRPCQuotaRemoved() throws Exception {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    final Connection conn = TEST_UTIL.getConnection();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    final Admin admin = conn.getAdmin();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    final TableName tn = TableName.valueOf(testName.getMethodName());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    final String ns = testName.getMethodName();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // Drop the ns if it somehow exists<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    if (namespaceExists(ns)) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      admin.deleteNamespace(ns);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    // Create the ns<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    admin.createNamespace(desc);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    assertEquals(0, getNumSpaceQuotas());<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    assertEquals(0, getThrottleQuotas());<a name="line.239"></a>
 <span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private void dropTable(Admin admin, TableName tn) throws  Exception {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    admin.disableTable(tn);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    admin.deleteTable(tn);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span>}<a name="line.245"></a>
+<span class="sourceLineNo">241</span>    // Set Both quotas<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    QuotaSettings settings =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        QuotaSettingsFactory.limitNamespaceSpace(ns, 1024L, SpaceViolationPolicy.NO_INSERTS);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    admin.setQuota(settings);<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    settings =<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        QuotaSettingsFactory.throttleNamespace(ns, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    admin.setQuota(settings);<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>    assertEquals(1, getNumSpaceQuotas());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    assertEquals(1, getThrottleQuotas());<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // Delete the namespace and observe the quotas being automatically deleted as well<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    admin.deleteNamespace(ns);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    assertEquals(0, getNumSpaceQuotas());<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    assertEquals(0, getThrottleQuotas());<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>  @Test<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  public void testObserverAddedByDefault() throws Exception {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    final HMaster master = TEST_UTIL.getHBaseCluster().getMaster();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    final MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    Set&lt;String&gt; coprocessorNames = cpHost.getCoprocessors();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertTrue(<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        "Did not find MasterQuotasObserver in list of CPs: " + coprocessorNames,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        coprocessorNames.contains(MasterQuotasObserver.class.getSimpleName()));<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>  public boolean namespaceExists(String ns) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    NamespaceDescriptor[] descs = TEST_UTIL.getAdmin().listNamespaceDescriptors();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    for (NamespaceDescriptor desc : descs) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      if (ns.equals(desc.getName())) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        return true;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return false;<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>  public int getNumSpaceQuotas() throws Exception {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    int numSpaceQuotas = 0;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    for (QuotaSettings quotaSettings : scanner) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (quotaSettings.getQuotaType() == QuotaType.SPACE) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        numSpaceQuotas++;<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>    return numSpaceQuotas;<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>  public int getThrottleQuotas() throws Exception {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    int throttleQuotas = 0;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    for (QuotaSettings quotaSettings : scanner) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      if (quotaSettings.getQuotaType() == QuotaType.THROTTLE) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throttleQuotas++;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return throttleQuotas;<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>  private void createTable(Admin admin, TableName tn) throws Exception {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // Create a table<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    HTableDescriptor tableDesc = new HTableDescriptor(tn);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    tableDesc.addFamily(new HColumnDescriptor("F1"));<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    admin.createTable(tableDesc);<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>  private void dropTable(Admin admin, TableName tn) throws  Exception {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    admin.disableTable(tn);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    admin.deleteTable(tn);<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>
 
 
 


[23/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
index 5bbbf0c..92967f2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
@@ -128,300 +128,300 @@
 <span class="sourceLineNo">120</span>  }<a name="line.120"></a>
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  @VisibleForTesting<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    try {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      if (provider != Providers.defaultProvider) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        // User gives a wal provider explicitly, just use that one<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        return provider.clazz;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      // AsyncFSWAL has better performance in most cases, and also uses less resources, we will try<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // to use it if possible. But it deeply hacks into the internal of DFSClient so will be easily<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      // broken when upgrading hadoop. If it is broken, then we fall back to use FSHLog.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      if (AsyncFSWALProvider.load()) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        return AsyncFSWALProvider.class;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      } else {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        return FSHLogProvider.class;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    } catch (IllegalArgumentException exception) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      // Fall back to them specifying a class name<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      // when there is a config value present.<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.class);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    try {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    } catch (Exception e) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      throw new IOException("couldn't set up WALProvider", e);<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>  /**<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   *          instances.<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   *          to make a directory<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    this(conf, factoryId, true);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  /**<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   *          instances.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *          to make a directory<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   *          {@link SyncReplicationWALProvider}<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      throws IOException {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      AbstractFSWALProvider.Reader.class);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    this.conf = conf;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    this.factoryId = factoryId;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    // end required early initialization<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      if (enableSyncReplicationWALProvider) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      }<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      provider.init(this, conf, null);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      this.provider = provider;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    } else {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // special handling of existing configuration behavior.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.warn("Running with WAL disabled.");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      provider = new DisabledWALProvider();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      provider.init(this, conf, factoryId);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>  /**<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * factory.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  public void close() throws IOException {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    if (null != metaProvider) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      metaProvider.close();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // within the getInstance method.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    if (null != provider) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      provider.close();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  /**<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  public void shutdown() throws IOException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    IOException exception = null;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    if (null != metaProvider) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      try {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        metaProvider.shutdown();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } catch(IOException ioe) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        exception = ioe;<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>    provider.shutdown();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    if (null != exception) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throw exception;<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><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public List&lt;WAL&gt; getWALs() {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    return provider.getWALs();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @VisibleForTesting<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  WALProvider getMetaProvider() throws IOException {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    for (;;) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      WALProvider provider = this.metaProvider.get();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      if (provider != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        return provider;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return provider;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      } else {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        // someone is ahead of us, close and try again.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        provider.close();<a name="line.261"></a>
+<span class="sourceLineNo">123</span>  Providers getDefaultProvider() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    return Providers.defaultProvider;<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>  @VisibleForTesting<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    try {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      // all versions.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        // easily broken when upgrading hadoop.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        return FSHLogProvider.class;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      }<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // not fall back to FSHLogProvider.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      return provider.clazz;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    } catch (IllegalArgumentException exception) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      // Fall back to them specifying a class name<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      // when there is a config value present.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.class);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<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>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    try {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    } catch (Exception e) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      throw new IOException("couldn't set up WALProvider", e);<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><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   *          instances.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   *          to make a directory<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    this(conf, factoryId, true);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *          instances.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *          to make a directory<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   *          {@link SyncReplicationWALProvider}<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      throws IOException {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      AbstractFSWALProvider.Reader.class);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    this.conf = conf;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    this.factoryId = factoryId;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // end required early initialization<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (enableSyncReplicationWALProvider) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      provider.init(this, conf, null);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      this.provider = provider;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // special handling of existing configuration behavior.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.warn("Running with WAL disabled.");<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      provider = new DisabledWALProvider();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      provider.init(this, conf, factoryId);<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><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * factory.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public void close() throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (null != metaProvider) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      metaProvider.close();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // within the getInstance method.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    if (null != provider) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      provider.close();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void shutdown() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    IOException exception = null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    if (null != metaProvider) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        metaProvider.shutdown();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch(IOException ioe) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        exception = ioe;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    provider.shutdown();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (null != exception) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw exception;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public List&lt;WAL&gt; getWALs() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return provider.getWALs();<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>  @VisibleForTesting<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  WALProvider getMetaProvider() throws IOException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    for (;;) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      WALProvider provider = this.metaProvider.get();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      if (provider != null) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return provider;<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>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    // use different WAL for hbase:meta<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return getMetaProvider().getWAL(region);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    } else {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      return provider.getWAL(region);<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>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    return createReader(fs, path, (CancelableProgressable)null);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  /**<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * then just seek back to the last known good position.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @return A WAL reader.  Close when done with it.<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * @throws IOException<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      CancelableProgressable reporter) throws IOException {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return createReader(fs, path, reporter, true);<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 Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      boolean allowCustom) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    try {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      // A wal file could be under recovery, so it may take several<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      // to open it up to 5 minutes by default.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      int nbAttempt = 0;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      while (true) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        try {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          reader.init(fs, path, conf, null);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          return reader;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        } catch (IOException e) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          if (reader != null) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              reader.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>            } catch (IOException exception) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              LOG.debug("exception details", exception);<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><a name="line.321"></a>
-<span class="sourceLineNo">322</span>          String msg = e.getMessage();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          if (msg != null<a name="line.323"></a>
-<span class="sourceLineNo">324</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>            if (++nbAttempt == 1) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.328"></a>
+<span class="sourceLineNo">263</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        return provider;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      } else {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // someone is ahead of us, close and try again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        provider.close();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // use different WAL for hbase:meta<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return getMetaProvider().getWAL(region);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return provider.getWAL(region);<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>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return createReader(fs, path, (CancelableProgressable)null);<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>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * then just seek back to the last known good position.<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @return A WAL reader.  Close when done with it.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      CancelableProgressable reporter) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    return createReader(fs, path, reporter, true);<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>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      boolean allowCustom) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // A wal file could be under recovery, so it may take several<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      // to open it up to 5 minutes by default.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      int nbAttempt = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      while (true) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        try {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          reader.init(fs, path, conf, null);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return reader;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          if (reader != null) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>              reader.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            } catch (IOException exception) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              LOG.debug("exception details", exception);<a name="line.328"></a>
 <span class="sourceLineNo">329</span>            }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.331"></a>
-<span class="sourceLineNo">332</span>            }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            } else {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              try {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>                continue; // retry<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              } catch (InterruptedException ie) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>                iioe.initCause(ie);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>                throw iioe;<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>            throw new LeaseNotRecoveredException(e);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          } else {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            throw e;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    } catch (IOException ie) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      throw ie;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    } catch (Exception e) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      throw new IOException("Cannot get log reader", e);<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><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * Create a writer for the WAL.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * Uses defaults.<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * &lt;p&gt;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * Should be package-private. public only for tests and<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * @return A WAL writer. Close when done with it.<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   */<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  /**<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * Should be package-private, visible for recovery testing.<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Uses defaults.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  @VisibleForTesting<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  }<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>  // These static methods are currently used where it's impractical to<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  // WALFactory that just provides Reader / Writers.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  <a name="line.388"></a>
-<span class="sourceLineNo">389</span>  // Public only for FSHLog<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    WALFactory factory = singleton.get();<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (null == factory) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      WALFactory temp = new WALFactory(configuration);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        factory = temp;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      } else {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // someone else beat us to initializing<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        try {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          temp.close();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        } catch (IOException exception) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        factory = singleton.get();<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return factory;<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>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * @return a WAL Reader, caller must close.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      final Configuration configuration) throws IOException {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    return getInstance(configuration).createReader(fs, path);<a name="line.416"></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>          String msg = e.getMessage();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          if (msg != null<a name="line.333"></a>
+<span class="sourceLineNo">334</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.334"></a>
+<span class="sourceLineNo">335</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.335"></a>
+<span class="sourceLineNo">336</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            if (++nbAttempt == 1) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.344"></a>
+<span class="sourceLineNo">345</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              try {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                continue; // retry<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              } catch (InterruptedException ie) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                iioe.initCause(ie);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                throw iioe;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            throw new LeaseNotRecoveredException(e);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          } else {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            throw e;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<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>    } catch (IOException ie) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      throw ie;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    } catch (Exception e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      throw new IOException("Cannot get log reader", e);<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>   * Create a writer for the WAL.<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * Uses defaults.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * &lt;p&gt;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * Should be package-private. public only for tests and<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * @return A WAL writer. Close when done with it.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<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>  /**<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * Should be package-private, visible for recovery testing.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Uses defaults.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  @VisibleForTesting<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      throws IOException {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // These static methods are currently used where it's impractical to<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  // WALFactory that just provides Reader / Writers.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  <a name="line.398"></a>
+<span class="sourceLineNo">399</span>  // Public only for FSHLog<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    WALFactory factory = singleton.get();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (null == factory) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      WALFactory temp = new WALFactory(configuration);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        factory = temp;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        // someone else beat us to initializing<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        try {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          temp.close();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        } catch (IOException exception) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        factory = singleton.get();<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>    return factory;<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>
@@ -429,53 +429,63 @@
 <span class="sourceLineNo">421</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.421"></a>
 <span class="sourceLineNo">422</span>   * @return a WAL Reader, caller must close.<a name="line.422"></a>
 <span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.426"></a>
+<span class="sourceLineNo">424</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      final Configuration configuration) throws IOException {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path);<a name="line.426"></a>
 <span class="sourceLineNo">427</span>  }<a name="line.427"></a>
 <span class="sourceLineNo">428</span><a name="line.428"></a>
 <span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.430"></a>
+<span class="sourceLineNo">430</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.430"></a>
 <span class="sourceLineNo">431</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * @return a WAL Reader, caller must close.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      final Configuration configuration) throws IOException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
+<span class="sourceLineNo">432</span>   * @return a WAL Reader, caller must close.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  /**<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.440"></a>
 <span class="sourceLineNo">441</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * Uses defaults.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.443"></a>
+<span class="sourceLineNo">442</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @return a WAL Reader, caller must close.<a name="line.443"></a>
 <span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      final Configuration configuration)<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      throws IOException {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<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>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * Uses defaults.<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   */<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @VisibleForTesting<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      final Configuration configuration)<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>  public final WALProvider getWALProvider() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return this.provider;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public final WALProvider getMetaWALProvider() {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    return this.metaProvider.get();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">445</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      final Configuration configuration) throws IOException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<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 you already have a WALFactory, you should favor the instance method.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * Uses defaults.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final Configuration configuration)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<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>
+<span class="sourceLineNo">462</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * Uses defaults.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   */<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      final Configuration configuration)<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throws IOException {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public final WALProvider getWALProvider() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return this.provider;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>  public final WALProvider getMetaWALProvider() {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    return this.metaProvider.get();<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>}<a name="line.480"></a>
 
 
 


[22/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
index 5bbbf0c..92967f2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
@@ -128,300 +128,300 @@
 <span class="sourceLineNo">120</span>  }<a name="line.120"></a>
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  @VisibleForTesting<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    try {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      if (provider != Providers.defaultProvider) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        // User gives a wal provider explicitly, just use that one<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        return provider.clazz;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      // AsyncFSWAL has better performance in most cases, and also uses less resources, we will try<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // to use it if possible. But it deeply hacks into the internal of DFSClient so will be easily<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      // broken when upgrading hadoop. If it is broken, then we fall back to use FSHLog.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      if (AsyncFSWALProvider.load()) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        return AsyncFSWALProvider.class;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      } else {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        return FSHLogProvider.class;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    } catch (IllegalArgumentException exception) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      // Fall back to them specifying a class name<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      // when there is a config value present.<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.class);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    try {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    } catch (Exception e) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      throw new IOException("couldn't set up WALProvider", e);<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>  /**<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   *          instances.<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   *          to make a directory<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    this(conf, factoryId, true);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  /**<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   *          instances.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *          to make a directory<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   *          {@link SyncReplicationWALProvider}<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      throws IOException {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      AbstractFSWALProvider.Reader.class);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    this.conf = conf;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    this.factoryId = factoryId;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    // end required early initialization<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      if (enableSyncReplicationWALProvider) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      }<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      provider.init(this, conf, null);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      this.provider = provider;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    } else {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // special handling of existing configuration behavior.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.warn("Running with WAL disabled.");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      provider = new DisabledWALProvider();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      provider.init(this, conf, factoryId);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>  /**<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * factory.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  public void close() throws IOException {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    if (null != metaProvider) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      metaProvider.close();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // within the getInstance method.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    if (null != provider) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      provider.close();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  /**<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  public void shutdown() throws IOException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    IOException exception = null;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    if (null != metaProvider) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      try {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        metaProvider.shutdown();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } catch(IOException ioe) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        exception = ioe;<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>    provider.shutdown();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    if (null != exception) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throw exception;<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><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public List&lt;WAL&gt; getWALs() {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    return provider.getWALs();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @VisibleForTesting<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  WALProvider getMetaProvider() throws IOException {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    for (;;) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      WALProvider provider = this.metaProvider.get();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      if (provider != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        return provider;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return provider;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      } else {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        // someone is ahead of us, close and try again.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        provider.close();<a name="line.261"></a>
+<span class="sourceLineNo">123</span>  Providers getDefaultProvider() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    return Providers.defaultProvider;<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>  @VisibleForTesting<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    try {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      // all versions.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        // easily broken when upgrading hadoop.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        return FSHLogProvider.class;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      }<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // not fall back to FSHLogProvider.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      return provider.clazz;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    } catch (IllegalArgumentException exception) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      // Fall back to them specifying a class name<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      // when there is a config value present.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.class);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<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>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    try {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    } catch (Exception e) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      throw new IOException("couldn't set up WALProvider", e);<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><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   *          instances.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   *          to make a directory<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    this(conf, factoryId, true);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *          instances.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *          to make a directory<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   *          {@link SyncReplicationWALProvider}<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      throws IOException {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      AbstractFSWALProvider.Reader.class);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    this.conf = conf;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    this.factoryId = factoryId;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // end required early initialization<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (enableSyncReplicationWALProvider) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      provider.init(this, conf, null);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      this.provider = provider;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // special handling of existing configuration behavior.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.warn("Running with WAL disabled.");<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      provider = new DisabledWALProvider();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      provider.init(this, conf, factoryId);<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><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * factory.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public void close() throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (null != metaProvider) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      metaProvider.close();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // within the getInstance method.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    if (null != provider) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      provider.close();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void shutdown() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    IOException exception = null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    if (null != metaProvider) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        metaProvider.shutdown();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch(IOException ioe) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        exception = ioe;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    provider.shutdown();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (null != exception) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw exception;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public List&lt;WAL&gt; getWALs() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return provider.getWALs();<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>  @VisibleForTesting<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  WALProvider getMetaProvider() throws IOException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    for (;;) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      WALProvider provider = this.metaProvider.get();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      if (provider != null) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return provider;<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>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    // use different WAL for hbase:meta<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return getMetaProvider().getWAL(region);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    } else {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      return provider.getWAL(region);<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>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    return createReader(fs, path, (CancelableProgressable)null);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  /**<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * then just seek back to the last known good position.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @return A WAL reader.  Close when done with it.<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * @throws IOException<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      CancelableProgressable reporter) throws IOException {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return createReader(fs, path, reporter, true);<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 Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      boolean allowCustom) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    try {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      // A wal file could be under recovery, so it may take several<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      // to open it up to 5 minutes by default.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      int nbAttempt = 0;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      while (true) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        try {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          reader.init(fs, path, conf, null);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          return reader;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        } catch (IOException e) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          if (reader != null) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              reader.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>            } catch (IOException exception) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              LOG.debug("exception details", exception);<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><a name="line.321"></a>
-<span class="sourceLineNo">322</span>          String msg = e.getMessage();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          if (msg != null<a name="line.323"></a>
-<span class="sourceLineNo">324</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>            if (++nbAttempt == 1) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.328"></a>
+<span class="sourceLineNo">263</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        return provider;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      } else {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // someone is ahead of us, close and try again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        provider.close();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // use different WAL for hbase:meta<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return getMetaProvider().getWAL(region);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return provider.getWAL(region);<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>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return createReader(fs, path, (CancelableProgressable)null);<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>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * then just seek back to the last known good position.<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @return A WAL reader.  Close when done with it.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      CancelableProgressable reporter) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    return createReader(fs, path, reporter, true);<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>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      boolean allowCustom) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // A wal file could be under recovery, so it may take several<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      // to open it up to 5 minutes by default.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      int nbAttempt = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      while (true) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        try {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          reader.init(fs, path, conf, null);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return reader;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          if (reader != null) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>              reader.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            } catch (IOException exception) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              LOG.debug("exception details", exception);<a name="line.328"></a>
 <span class="sourceLineNo">329</span>            }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.331"></a>
-<span class="sourceLineNo">332</span>            }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            } else {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              try {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>                continue; // retry<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              } catch (InterruptedException ie) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>                iioe.initCause(ie);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>                throw iioe;<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>            throw new LeaseNotRecoveredException(e);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          } else {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            throw e;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    } catch (IOException ie) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      throw ie;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    } catch (Exception e) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      throw new IOException("Cannot get log reader", e);<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><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * Create a writer for the WAL.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * Uses defaults.<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * &lt;p&gt;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * Should be package-private. public only for tests and<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * @return A WAL writer. Close when done with it.<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   */<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  /**<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * Should be package-private, visible for recovery testing.<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Uses defaults.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  @VisibleForTesting<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  }<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>  // These static methods are currently used where it's impractical to<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  // WALFactory that just provides Reader / Writers.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  <a name="line.388"></a>
-<span class="sourceLineNo">389</span>  // Public only for FSHLog<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    WALFactory factory = singleton.get();<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (null == factory) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      WALFactory temp = new WALFactory(configuration);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        factory = temp;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      } else {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // someone else beat us to initializing<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        try {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          temp.close();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        } catch (IOException exception) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        factory = singleton.get();<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return factory;<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>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * @return a WAL Reader, caller must close.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      final Configuration configuration) throws IOException {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    return getInstance(configuration).createReader(fs, path);<a name="line.416"></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>          String msg = e.getMessage();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          if (msg != null<a name="line.333"></a>
+<span class="sourceLineNo">334</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.334"></a>
+<span class="sourceLineNo">335</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.335"></a>
+<span class="sourceLineNo">336</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            if (++nbAttempt == 1) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.344"></a>
+<span class="sourceLineNo">345</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              try {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                continue; // retry<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              } catch (InterruptedException ie) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                iioe.initCause(ie);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                throw iioe;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            throw new LeaseNotRecoveredException(e);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          } else {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            throw e;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<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>    } catch (IOException ie) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      throw ie;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    } catch (Exception e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      throw new IOException("Cannot get log reader", e);<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>   * Create a writer for the WAL.<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * Uses defaults.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * &lt;p&gt;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * Should be package-private. public only for tests and<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * @return A WAL writer. Close when done with it.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<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>  /**<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * Should be package-private, visible for recovery testing.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Uses defaults.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  @VisibleForTesting<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      throws IOException {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // These static methods are currently used where it's impractical to<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  // WALFactory that just provides Reader / Writers.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  <a name="line.398"></a>
+<span class="sourceLineNo">399</span>  // Public only for FSHLog<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    WALFactory factory = singleton.get();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (null == factory) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      WALFactory temp = new WALFactory(configuration);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        factory = temp;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        // someone else beat us to initializing<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        try {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          temp.close();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        } catch (IOException exception) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        factory = singleton.get();<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>    return factory;<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>
@@ -429,53 +429,63 @@
 <span class="sourceLineNo">421</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.421"></a>
 <span class="sourceLineNo">422</span>   * @return a WAL Reader, caller must close.<a name="line.422"></a>
 <span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.426"></a>
+<span class="sourceLineNo">424</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      final Configuration configuration) throws IOException {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path);<a name="line.426"></a>
 <span class="sourceLineNo">427</span>  }<a name="line.427"></a>
 <span class="sourceLineNo">428</span><a name="line.428"></a>
 <span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.430"></a>
+<span class="sourceLineNo">430</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.430"></a>
 <span class="sourceLineNo">431</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * @return a WAL Reader, caller must close.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      final Configuration configuration) throws IOException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
+<span class="sourceLineNo">432</span>   * @return a WAL Reader, caller must close.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  /**<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.440"></a>
 <span class="sourceLineNo">441</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * Uses defaults.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.443"></a>
+<span class="sourceLineNo">442</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @return a WAL Reader, caller must close.<a name="line.443"></a>
 <span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      final Configuration configuration)<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      throws IOException {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<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>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * Uses defaults.<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   */<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @VisibleForTesting<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      final Configuration configuration)<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>  public final WALProvider getWALProvider() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return this.provider;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public final WALProvider getMetaWALProvider() {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    return this.metaProvider.get();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">445</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      final Configuration configuration) throws IOException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<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 you already have a WALFactory, you should favor the instance method.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * Uses defaults.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final Configuration configuration)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<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>
+<span class="sourceLineNo">462</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * Uses defaults.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   */<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      final Configuration configuration)<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throws IOException {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public final WALProvider getWALProvider() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return this.provider;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>  public final WALProvider getMetaWALProvider() {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    return this.metaProvider.get();<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>}<a name="line.480"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 6666173..3738f52 100644
--- a/downloads.html
+++ b/downloads.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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -423,7 +423,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 1e74603..d1f59e1 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -331,7 +331,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index dc813ff..239aea0 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -411,7 +411,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 0f7f8f4..e15b228 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index e74d072..45f094c 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 8a4e662..0a52687 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -491,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 9edb23f..f8c0ac6 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index dbe8eb4..1477a0c 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 1d92dd6..9d27a81 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -440,7 +440,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index dfbc508..3e03bf8 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 01068eb..061b48d 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 73b9228..9f1e9f2 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -769,7 +769,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 943106c..3b29cfe 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 0377ca5..c62601c 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 8ddcf9d..1423a2e 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 4acfe77..648d9d9 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 773b2f6..0f317fd 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -303,7 +303,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 


[39/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index a4394b1..f5aee78 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: 3703,
-             Errors: 15546,
+             Errors: 15547,
              Warnings: 0,
              Infos: 0
       </title>
@@ -6789,7 +6789,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  27
+                  29
                 </td>
               </tr>
                           <tr>
@@ -28335,7 +28335,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  2
+                  4
                 </td>
               </tr>
                           <tr>
@@ -48789,7 +48789,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  4
+                  1
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 5054798..ea13ad8 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 7ca1c08..d588058 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index e8d4621..3789d45 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -890,7 +890,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 6955512..809ecfb 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index de794f8..084d1ef 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 5b1f980..6347ac2 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3817,21 +3817,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>"Thu Aug 16 14:38:56 UTC 2018"</code></td>
+<td class="colLast"><code>"Sat Aug 18 14:39:09 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>"092efb42749bf7fc6ad338c96aae8e7b9d3a2c74"</code></td>
+<td class="colLast"><code>"d159b1f8bb9a29f7786a96c910157e12583768a2"</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>"ea011180320b95ba2577dbbea3f2ed3d"</code></td>
+<td class="colLast"><code>"73b5057405b2d43ef71a02a118264fac"</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/7cafc412/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index e3af1fc..6c68f68 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -38150,6 +38150,8 @@
 <dd>
 <div class="block">The default <a href="org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master"><code>LoadBalancer</code></a> class.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#getDefaultProvider--">getDefaultProvider()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/RegionLocations.html#getDefaultRegionLocation--">getDefaultRegionLocation()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/CommonFSUtils.html#getDefaultReplication-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">getDefaultReplication(FileSystem, Path)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/CommonFSUtils.html" title="class in org.apache.hadoop.hbase.util">CommonFSUtils</a></dt>
@@ -59631,6 +59633,10 @@
 <dd>
 <div class="block">Sets the execution time of a period of the QuotaObserverChore.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/StoreFileReader.html#incrementRefCount--">incrementRefCount()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a></dt>
+<dd>
+<div class="block">Indicate that the scanner has started reading with this reader.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#incrementRefCountAndGet--">incrementRefCountAndGet()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#incrementRefCountAndGet--">incrementRefCountAndGet()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.SharedMemoryBucketEntry</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 a6b88dd..d0d625a 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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.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/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</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/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/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 ead79f5..9f2984c 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/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/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/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/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/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/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/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/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/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/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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.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/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 329f62f..e67b778 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/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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 099d04c..0193c21 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/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/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/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
index 6bce66c..caf7cc9 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1304">BucketCache.BucketEntry</a>
+<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1306">BucketCache.BucketEntry</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/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a></pre>
 <div class="block">Item in cache. We expect this to be where most memory goes. Java uses 8
@@ -309,7 +309,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>serialVersionUID</h4>
-<pre>private static final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1305">serialVersionUID</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1307">serialVersionUID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.BucketEntry.serialVersionUID">Constant Field Values</a></dd>
@@ -322,7 +322,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>COMPARATOR</h4>
-<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1308">COMPARATOR</a></pre>
+<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1310">COMPARATOR</a></pre>
 </li>
 </ul>
 <a name="offsetBase">
@@ -331,7 +331,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>offsetBase</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1311">offsetBase</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1313">offsetBase</a></pre>
 </li>
 </ul>
 <a name="length">
@@ -340,7 +340,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>length</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1312">length</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1314">length</a></pre>
 </li>
 </ul>
 <a name="offset1">
@@ -349,7 +349,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>offset1</h4>
-<pre>private&nbsp;byte <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1313">offset1</a></pre>
+<pre>private&nbsp;byte <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1315">offset1</a></pre>
 </li>
 </ul>
 <a name="deserialiserIndex">
@@ -358,7 +358,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>deserialiserIndex</h4>
-<pre>byte <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1319">deserialiserIndex</a></pre>
+<pre>byte <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1321">deserialiserIndex</a></pre>
 <div class="block">The index of the deserializer that can deserialize this BucketEntry content.
  See <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializerIdManager.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>CacheableDeserializerIdManager</code></a> for hosting of index to serializers.</div>
 </li>
@@ -369,7 +369,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>accessCounter</h4>
-<pre>private volatile&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1321">accessCounter</a></pre>
+<pre>private volatile&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1323">accessCounter</a></pre>
 </li>
 </ul>
 <a name="priority">
@@ -378,7 +378,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>priority</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockPriority</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1322">priority</a></pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockPriority</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1324">priority</a></pre>
 </li>
 </ul>
 <a name="cachedTime">
@@ -387,7 +387,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cachedTime</h4>
-<pre>private final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1327">cachedTime</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1329">cachedTime</a></pre>
 <div class="block">Time this block was cached.  Presumes we are created just before we are added to the cache.</div>
 </li>
 </ul>
@@ -405,7 +405,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BucketEntry</h4>
-<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1329">BucketEntry</a>(long&nbsp;offset,
+<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1331">BucketEntry</a>(long&nbsp;offset,
             int&nbsp;length,
             long&nbsp;accessCounter,
             boolean&nbsp;inMemory)</pre>
@@ -425,7 +425,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>offset</h4>
-<pre>long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1340">offset</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1342">offset</a>()</pre>
 </li>
 </ul>
 <a name="setOffset-long-">
@@ -434,7 +434,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>setOffset</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1346">setOffset</a>(long&nbsp;value)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1348">setOffset</a>(long&nbsp;value)</pre>
 </li>
 </ul>
 <a name="getLength--">
@@ -443,7 +443,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>getLength</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1353">getLength</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1355">getLength</a>()</pre>
 </li>
 </ul>
 <a name="deserializerReference--">
@@ -452,7 +452,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializerReference</h4>
-<pre>protected&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1357">deserializerReference</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1359">deserializerReference</a>()</pre>
 </li>
 </ul>
 <a name="setDeserialiserReference-org.apache.hadoop.hbase.io.hfile.CacheableDeserializer-">
@@ -461,7 +461,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>setDeserialiserReference</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1361">setDeserialiserReference</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;deserializer)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1363">setDeserialiserReference</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;deserializer)</pre>
 </li>
 </ul>
 <a name="getAccessCounter--">
@@ -470,7 +470,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>getAccessCounter</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1365">getAccessCounter</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1367">getAccessCounter</a>()</pre>
 </li>
 </ul>
 <a name="access-long-">
@@ -479,7 +479,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>access</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1372">access</a>(long&nbsp;accessCounter)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1374">access</a>(long&nbsp;accessCounter)</pre>
 <div class="block">Block has been accessed. Update its local access counter.</div>
 </li>
 </ul>
@@ -489,7 +489,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>getPriority</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockPriority</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1379">getPriority</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockPriority</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1381">getPriority</a>()</pre>
 </li>
 </ul>
 <a name="getCachedTime--">
@@ -498,7 +498,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>getCachedTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1383">getCachedTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1385">getCachedTime</a>()</pre>
 </li>
 </ul>
 <a name="getRefCount--">
@@ -507,7 +507,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>getRefCount</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1387">getRefCount</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1389">getRefCount</a>()</pre>
 </li>
 </ul>
 <a name="incrementRefCountAndGet--">
@@ -516,7 +516,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementRefCountAndGet</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1391">incrementRefCountAndGet</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1393">incrementRefCountAndGet</a>()</pre>
 </li>
 </ul>
 <a name="decrementRefCountAndGet--">
@@ -525,7 +525,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>decrementRefCountAndGet</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1395">decrementRefCountAndGet</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1397">decrementRefCountAndGet</a>()</pre>
 </li>
 </ul>
 <a name="isMarkedForEvict--">
@@ -534,7 +534,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>isMarkedForEvict</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1399">isMarkedForEvict</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1401">isMarkedForEvict</a>()</pre>
 </li>
 </ul>
 <a name="markForEvict--">
@@ -543,7 +543,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>markForEvict</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1403">markForEvict</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#line.1405">markForEvict</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
index 3722981..6845cad 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1451">BucketCache.BucketEntryGroup</a>
+<pre>private class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1453">BucketCache.BucketEntryGroup</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">Used to group bucket entries into priority buckets. There will be a
  BucketEntryGroup for each priority (single, multi, memory). Once bucketed,
@@ -227,7 +227,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>queue</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">CachedEntryQueue</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1453">queue</a></pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">CachedEntryQueue</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1455">queue</a></pre>
 </li>
 </ul>
 <a name="totalSize">
@@ -236,7 +236,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>totalSize</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1454">totalSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1456">totalSize</a></pre>
 </li>
 </ul>
 <a name="bucketSize">
@@ -245,7 +245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>bucketSize</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1455">bucketSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1457">bucketSize</a></pre>
 </li>
 </ul>
 </li>
@@ -262,7 +262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BucketEntryGroup</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1457">BucketEntryGroup</a>(long&nbsp;bytesToFree,
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1459">BucketEntryGroup</a>(long&nbsp;bytesToFree,
                         long&nbsp;blockSize,
                         long&nbsp;bucketSize)</pre>
 </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>add</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1463">add</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry.html?is-external=true" title="class or interface in java.util">Map.Entry</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>,<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a>&gt;&nbsp;block)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1465">add</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry.html?is-external=true" title="class or interface in java.util">Map.Entry</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>,<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a>&gt;&nbsp;block)</pre>
 </li>
 </ul>
 <a name="free-long-">
@@ -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>free</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1468">free</a>(long&nbsp;toFree)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1470">free</a>(long&nbsp;toFree)</pre>
 </li>
 </ul>
 <a name="overflow--">
@@ -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>overflow</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1484">overflow</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1486">overflow</a>()</pre>
 </li>
 </ul>
 <a name="totalSize--">
@@ -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>totalSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1488">totalSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1490">totalSize</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
index f93a683..1256985 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1497">BucketCache.RAMQueueEntry</a>
+<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1499">BucketCache.RAMQueueEntry</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">Block Entry stored in the memory with key,data and so on</div>
 </li>
@@ -231,7 +231,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>key</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1498">key</a></pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1500">key</a></pre>
 </li>
 </ul>
 <a name="data">
@@ -240,7 +240,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>data</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1499">data</a></pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1501">data</a></pre>
 </li>
 </ul>
 <a name="accessCounter">
@@ -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>accessCounter</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1500">accessCounter</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1502">accessCounter</a></pre>
 </li>
 </ul>
 <a name="inMemory">
@@ -258,7 +258,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>inMemory</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1501">inMemory</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1503">inMemory</a></pre>
 </li>
 </ul>
 </li>
@@ -275,7 +275,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RAMQueueEntry</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1503">RAMQueueEntry</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;bck,
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1505">RAMQueueEntry</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;bck,
                      <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;data,
                      long&nbsp;accessCounter,
                      boolean&nbsp;inMemory)</pre>
@@ -295,7 +295,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getData</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1511">getData</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1513">getData</a>()</pre>
 </li>
 </ul>
 <a name="getKey--">
@@ -304,7 +304,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getKey</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1515">getKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1517">getKey</a>()</pre>
 </li>
 </ul>
 <a name="access-long-">
@@ -313,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>access</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1519">access</a>(long&nbsp;accessCounter)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1521">access</a>(long&nbsp;accessCounter)</pre>
 </li>
 </ul>
 <a name="writeToCache-org.apache.hadoop.hbase.io.hfile.bucket.IOEngine-org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocator-java.util.concurrent.atomic.LongAdder-">
@@ -322,7 +322,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writeToCache</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1523">writeToCache</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.html" title="interface in org.apache.hadoop.hbase.io.hfile.bucket">IOEngine</a>&nbsp;ioEngine,
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1525">writeToCache</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.html" title="interface in org.apache.hadoop.hbase.io.hfile.bucket">IOEngine</a>&nbsp;ioEngine,
                                             <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocator</a>&nbsp;bucketAllocator,
                                             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;realCacheSize)
                                      throws <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/CacheFullException.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">CacheFullException</a>,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
index ddadbd6..4fd9643 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1408">BucketCache.SharedMemoryBucketEntry</a>
+<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1410">BucketCache.SharedMemoryBucketEntry</a>
 extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a></pre>
 </li>
 </ul>
@@ -251,7 +251,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockList">
 <li class="blockList">
 <h4>serialVersionUID</h4>
-<pre>private static final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1409">serialVersionUID</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1411">serialVersionUID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.SharedMemoryBucketEntry.serialVersionUID">Constant Field Values</a></dd>
@@ -264,7 +264,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockList">
 <li class="blockList">
 <h4>markedForEvict</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1412">markedForEvict</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1414">markedForEvict</a></pre>
 </li>
 </ul>
 <a name="refCount">
@@ -273,7 +273,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>refCount</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/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1413">refCount</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/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1415">refCount</a></pre>
 </li>
 </ul>
 </li>
@@ -290,7 +290,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SharedMemoryBucketEntry</h4>
-<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1415">SharedMemoryBucketEntry</a>(long&nbsp;offset,
+<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1417">SharedMemoryBucketEntry</a>(long&nbsp;offset,
                         int&nbsp;length,
                         long&nbsp;accessCounter,
                         boolean&nbsp;inMemory)</pre>
@@ -310,7 +310,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockList">
 <li class="blockList">
 <h4>getRefCount</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1420">getRefCount</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1422">getRefCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#getRefCount--">getRefCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a></code></dd>
@@ -323,7 +323,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementRefCountAndGet</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1425">incrementRefCountAndGet</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1427">incrementRefCountAndGet</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#incrementRefCountAndGet--">incrementRefCountAndGet</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a></code></dd>
@@ -336,7 +336,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockList">
 <li class="blockList">
 <h4>decrementRefCountAndGet</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1430">decrementRefCountAndGet</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1432">decrementRefCountAndGet</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#decrementRefCountAndGet--">decrementRefCountAndGet</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a></code></dd>
@@ -349,7 +349,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockList">
 <li class="blockList">
 <h4>isMarkedForEvict</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1435">isMarkedForEvict</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1437">isMarkedForEvict</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#isMarkedForEvict--">isMarkedForEvict</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a></code></dd>
@@ -362,7 +362,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/Bu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>markForEvict</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1440">markForEvict</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.SharedMemoryBucketEntry.html#line.1442">markForEvict</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html#markForEvict--">markForEvict</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.BucketEntry</a></code></dd>


[35/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 19354d1..7eedc5c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,9 +247,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.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>
 <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/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 30c4e73..cd3870f 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -207,8 +207,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.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 8051208..f594c43 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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 6ef281d..13f949c 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -192,8 +192,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.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/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/7cafc412/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 81a90a9..2cef8bd 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -199,9 +199,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.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>
 <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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 45de9e9..0e2122a 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -515,14 +515,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.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/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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.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/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.Providers.html b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
index e5c4f0b..64fb904 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
@@ -297,7 +297,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html#line.69">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html#line.30">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -317,7 +317,7 @@ for (WALFactory.Providers c : WALFactory.Providers.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html#line.69">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;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html#line.30">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;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
index 7a02d08..df7002f 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":10,"i5":9,"i6":9,"i7":9,"i8":10,"i9":9,"i10":10,"i11":9,"i12":9,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10};
+var methods = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":10,"i5":9,"i6":9,"i7":9,"i8":10,"i9":9,"i10":10,"i11":9,"i12":10,"i13":9,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":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";
@@ -352,35 +352,39 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </td>
 </tr>
 <tr id="i12" class="altColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getDefaultProvider--">getDefaultProvider</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getInstance-org.apache.hadoop.conf.Configuration-">getInstance</a></span>(org.apache.hadoop.conf.Configuration&nbsp;configuration)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getMetaProvider--">getMetaProvider</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getMetaWALProvider--">getMetaWALProvider</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-">getProviderClass</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;key,
                 <a href="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;defaultValue)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getWAL-org.apache.hadoop.hbase.client.RegionInfo-">getWAL</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 id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getWALProvider--">getWALProvider</a></span>()</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/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getWALs--">getWALs</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#shutdown--">shutdown</a></span>()</code>
 <div class="block">Tell the underlying WAL providers to shut down, but do not clean up underlying storage.</div>
@@ -514,7 +518,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>singleton</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.386">singleton</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.396">singleton</a></pre>
 </li>
 </ul>
 <a name="SINGLETON_ID">
@@ -523,7 +527,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SINGLETON_ID</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/wal/WALFactory.html#line.387">SINGLETON_ID</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/wal/WALFactory.html#line.397">SINGLETON_ID</a></pre>
 </li>
 </ul>
 </li>
@@ -549,7 +553,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.163">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.173">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   <a href="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;factoryId)
            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>
@@ -569,7 +573,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.177">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.187">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   <a href="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;factoryId,
                   boolean&nbsp;enableSyncReplicationWALProvider)
            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>
@@ -594,13 +598,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="getDefaultProvider--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getDefaultProvider</h4>
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.123">getDefaultProvider</a>()</pre>
+</li>
+</ul>
 <a name="getProviderClass-java.lang.String-java.lang.String-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getProviderClass</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.123">getProviderClass</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;key,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.128">getProviderClass</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;key,
                                                      <a href="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;defaultValue)</pre>
 </li>
 </ul>
@@ -610,7 +623,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createProvider</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.146">createProvider</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;clazz)
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.156">createProvider</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;clazz)
                            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>
@@ -624,7 +637,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.209">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.219">close</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">Shutdown all WALs and clean up any underlying storage.
  Use only when you will not need to replay and edits that have gone to any wals from this
@@ -641,7 +654,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.226">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.236">shutdown</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">Tell the underlying WAL providers to shut down, but do not clean up underlying storage.
  If you are not ending cleanly and will need to replay edits from this factory's wals,
@@ -658,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>getWALs</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/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.242">getWALs</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/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.252">getWALs</a>()</pre>
 </li>
 </ul>
 <a name="getMetaProvider--">
@@ -667,7 +680,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaProvider</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.247">getMetaProvider</a>()
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.257">getMetaProvider</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -681,7 +694,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.269">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.279">getWAL</a>(<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>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -697,7 +710,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.279">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.289">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path)
                         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>
@@ -712,7 +725,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.290">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.300">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                         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>
@@ -733,7 +746,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.295">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.305">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter,
                                boolean&nbsp;allowCustom)
@@ -750,7 +763,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALWriter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.367">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.377">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                           org.apache.hadoop.fs.Path&nbsp;path)
                                    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">Create a writer for the WAL.
@@ -772,7 +785,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRecoveredEditsWriter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.377">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.387">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                      org.apache.hadoop.fs.Path&nbsp;path)
                                               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">Should be package-private, visible for recovery testing.
@@ -791,7 +804,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getInstance</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.390">getInstance</a>(org.apache.hadoop.conf.Configuration&nbsp;configuration)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.400">getInstance</a>(org.apache.hadoop.conf.Configuration&nbsp;configuration)</pre>
 </li>
 </ul>
 <a name="createReader-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">
@@ -800,7 +813,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.414">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.424">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                       org.apache.hadoop.fs.Path&nbsp;path,
                                       org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                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>
@@ -820,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>createReader</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.424">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.434">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                org.apache.hadoop.conf.Configuration&nbsp;configuration,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
@@ -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>createReaderIgnoreCustomClass</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.435">createReaderIgnoreCustomClass</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.445">createReaderIgnoreCustomClass</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                        org.apache.hadoop.fs.Path&nbsp;path,
                                                        org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                                 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>
@@ -862,7 +875,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRecoveredEditsWriter</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.445">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.455">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                      org.apache.hadoop.fs.Path&nbsp;path,
                                                      org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                               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>
@@ -882,7 +895,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALWriter</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.457">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.467">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                  org.apache.hadoop.fs.Path&nbsp;path,
                                                  org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                           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>
@@ -902,7 +915,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALProvider</h4>
-<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.463">getWALProvider</a>()</pre>
+<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.473">getWALProvider</a>()</pre>
 </li>
 </ul>
 <a name="getMetaWALProvider--">
@@ -911,7 +924,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMetaWALProvider</h4>
-<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.467">getMetaWALProvider</a>()</pre>
+<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.477">getMetaWALProvider</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALFactory.Providers.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALFactory.Providers.html b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALFactory.Providers.html
index 406251d..04bf22d 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALFactory.Providers.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALFactory.Providers.html
@@ -103,12 +103,16 @@
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a></code></td>
+<td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getDefaultProvider--">getDefaultProvider</a></span>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a></code></td>
 <td class="colLast"><span class="typeNameLabel">WALFactory.Providers.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html#valueOf-java.lang.String-">valueOf</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;name)</code>
 <div class="block">Returns the enum constant of this type with the specified name.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>[]</code></td>
 <td class="colLast"><span class="typeNameLabel">WALFactory.Providers.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html#values--">values</a></span>()</code>
 <div class="block">Returns an array containing the constants of this enum type, in

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 e1ef1a3..85dad6a 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 = "092efb42749bf7fc6ad338c96aae8e7b9d3a2c74";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "d159b1f8bb9a29f7786a96c910157e12583768a2";<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 = "Thu Aug 16 14:38:56 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat Aug 18 14:39:09 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 = "ea011180320b95ba2577dbbea3f2ed3d";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "73b5057405b2d43ef71a02a118264fac";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[29/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.WriterThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.WriterThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.WriterThread.html
index 794e33b..3ec9a39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.WriterThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.WriterThread.html
@@ -1089,640 +1089,642 @@
 <span class="sourceLineNo">1081</span>  /**<a name="line.1081"></a>
 <span class="sourceLineNo">1082</span>   * @see #retrieveFromFile(int[])<a name="line.1082"></a>
 <span class="sourceLineNo">1083</span>   */<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  private void persistToFile() throws IOException {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    assert !cacheEnabled;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    if (!ioEngine.isPersistent()) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>  }<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>   * @see #persistToFile()<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>   */<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    File persistenceFile = new File(persistencePath);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (!persistenceFile.exists()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      return;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    assert !cacheEnabled;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      byte[] pbuf = new byte[pblen];<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      int read = in.read(pbuf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      if (read != pblen) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            persistencePath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  /**<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>   * &lt;pre&gt;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   *   File f = ...<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   *     // use the input stream<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   *   } finally {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   *   }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * &lt;/pre&gt;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * @param file the file to read and delete<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @return a FileInputStream for the given file<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @throws IOException if there is a problem creating the stream<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return new FileInputStream(file) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      public void close() throws IOException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        super.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (!file.delete()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    };<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      throws IOException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (capacitySize != cacheCapacity) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>  }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span><a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>  /**<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>   * cache<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   */<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>  private void checkIOErrorIsTolerated() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        disableCache();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    } else {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      this.ioErrorStartTime = now;<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>  /**<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   */<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>  private void disableCache() {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    if (!cacheEnabled) return;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    cacheEnabled = false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    ioEngine.shutdown();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    this.scheduleThreadPool.shutdown();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    this.ramCache.clear();<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.backingMap.clear();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  private void join() throws InterruptedException {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      writerThreads[i].join();<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  @Override<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  public void shutdown() {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    disableCache();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        + "; path to write=" + persistencePath);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        join();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>        persistToFile();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      } catch (IOException ex) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      } catch (InterruptedException e) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      }<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span><a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  public CacheStats getStats() {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    return cacheStats;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>  public BucketAllocator getAllocator() {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    return this.bucketAllocator;<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>  @Override<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public long heapSize() {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    return this.heapSize.sum();<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public long size() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return this.realCacheSize.sum();<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  @Override<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  public long getCurrentDataSize() {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    return size();<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  }<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>  @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>  public long getFreeSize() {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return this.bucketAllocator.getFreeSize();<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  public long getBlockCount() {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    return this.blockNumber.sum();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>  @Override<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  public long getDataBlockCount() {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    return getBlockCount();<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>  }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  @Override<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  public long getCurrentSize() {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    return this.bucketAllocator.getUsedSize();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  }<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>   * Evicts all blocks for a specific HFile.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * &lt;p&gt;<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   *<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * @return the number of blocks evicted<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    int numEvicted = 0;<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    for (BlockCacheKey key : keySet) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      if (evictBlock(key)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          ++numEvicted;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    return numEvicted;<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>  /**<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>   */<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  static class BucketEntry implements Serializable {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // access counter comparator, descending order<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    private int offsetBase;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    private int length;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private byte offset1;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    /**<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>     */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    byte deserialiserIndex;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    private volatile long accessCounter;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    private BlockPriority priority;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>     */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    private final long cachedTime = System.nanoTime();<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      setOffset(offset);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      this.length = length;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      this.accessCounter = accessCounter;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      if (inMemory) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        this.priority = BlockPriority.MEMORY;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.SINGLE;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    long offset() { // Java has no unsigned numbers<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return o &lt;&lt; 8;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private void setOffset(long value) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      assert (value &amp; 0xFF) == 0;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      value &gt;&gt;= 8;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      offsetBase = (int) value;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    public int getLength() {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return length;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span><a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<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>    public long getAccessCounter() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      return accessCounter;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span><a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    /**<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>     * Block has been accessed. Update its local access counter.<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>     */<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    public void access(long accessCounter) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      this.accessCounter = accessCounter;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        this.priority = BlockPriority.MULTI;<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><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    public BlockPriority getPriority() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return this.priority;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    public long getCachedTime() {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      return cachedTime;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    protected int getRefCount() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return 0;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    protected int incrementRefCountAndGet() {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      return 0;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span><a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    protected int decrementRefCountAndGet() {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    protected boolean isMarkedForEvict() {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      return false;<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    protected void markForEvict() {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      // noop;<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  static class SharedMemoryBucketEntry extends BucketEntry {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    private static final long serialVersionUID = -2187147283772338481L;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Set this when we were not able to forcefully evict the block<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    private volatile boolean markedForEvict;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    private AtomicInteger refCount = new AtomicInteger(0);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    SharedMemoryBucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      super(offset, length, accessCounter, inMemory);<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    @Override<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    protected int getRefCount() {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      return this.refCount.get();<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    @Override<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    protected int incrementRefCountAndGet() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      return this.refCount.incrementAndGet();<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>    @Override<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    protected int decrementRefCountAndGet() {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      return this.refCount.decrementAndGet();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    @Override<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    protected boolean isMarkedForEvict() {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      return this.markedForEvict;<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    @Override<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    protected void markForEvict() {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      this.markedForEvict = true;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  /**<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   * according to configuration parameters and their relative sizes.<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   */<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  private class BucketEntryGroup {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    private CachedEntryQueue queue;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    private long totalSize = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    private long bucketSize;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      this.bucketSize = bucketSize;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      totalSize = 0;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span><a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      totalSize += block.getValue().getLength();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      queue.add(block);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    public long free(long toFree) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>      long freedBytes = 0;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        if (evictBlock(entry.getKey(), false)) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          freedBytes += entry.getValue().getLength();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        }<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (freedBytes &gt;= toFree) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          return freedBytes;<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      }<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      return freedBytes;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    public long overflow() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      return totalSize - bucketSize;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span><a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    public long totalSize() {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      return totalSize;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span><a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  /**<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>   */<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  @VisibleForTesting<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>  static class RAMQueueEntry {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private BlockCacheKey key;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    private Cacheable data;<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    private long accessCounter;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    private boolean inMemory;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    public RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        boolean inMemory) {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>      this.key = bck;<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      this.data = data;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      this.accessCounter = accessCounter;<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>      this.inMemory = inMemory;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    public Cacheable getData() {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      return data;<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span><a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    public BlockCacheKey getKey() {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return key;<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    public void access(long accessCounter) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      this.accessCounter = accessCounter;<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    public BucketEntry writeToCache(final IOEngine ioEngine,<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        final BucketAllocator bucketAllocator,<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>        final LongAdder realCacheSize) throws CacheFullException, IOException,<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        BucketAllocatorException {<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      int len = data.getSerializedLength();<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      // This cacheable thing can't be serialized<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      if (len == 0) return null;<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      long offset = bucketAllocator.allocateBlock(len);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      BucketEntry bucketEntry = ioEngine.usesSharedMemory()<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>          ? UnsafeAvailChecker.isAvailable()<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>              ? new UnsafeSharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>              : new SharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          : new BucketEntry(offset, len, accessCounter, inMemory);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      bucketEntry.setDeserialiserReference(data.getDeserializer());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      try {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>        if (data instanceof HFileBlock) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>          HFileBlock block = (HFileBlock)data;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          if (LOG.isTraceEnabled()) {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>            LOG.trace("Write offset=" + offset + ", len=" + len);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>          }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>          ioEngine.write(sliceBuf, offset);<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>        } else {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>          data.serialize(bb, true);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>          ioEngine.write(bb, offset);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      } catch (IOException ioe) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        // free it in bucket allocator<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>        bucketAllocator.freeBlock(offset);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw ioe;<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      realCacheSize.add(len);<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      return bucketEntry;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    }<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  /**<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * Only used in test<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @throws InterruptedException<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   */<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      writerThread.disableWriter();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      writerThread.interrupt();<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      writerThread.join();<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>  }<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span><a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        this.backingMap.entrySet().iterator();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      private final long now = System.nanoTime();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      @Override<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      public boolean hasNext() {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>        return i.hasNext();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      @Override<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      public CachedBlock next() {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>        return new CachedBlock() {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>          @Override<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>          public String toString() {<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>            return BlockCacheUtil.toString(this, now);<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>          public BlockPriority getBlockPriority() {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            return e.getValue().getPriority();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>          }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          @Override<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>          public BlockType getBlockType() {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return null;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public long getOffset() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().getOffset();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public long getSize() {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            return e.getValue().getLength();<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          }<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>          @Override<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>          public long getCachedTime() {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            return e.getValue().getCachedTime();<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          public String getFilename() {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>            return e.getKey().getHfileName();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>          public int compareTo(CachedBlock other) {<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>            if (diff != 0) return diff;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span><a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            if (diff != 0) return diff;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>                other.getCachedTime());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>            }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span><a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          @Override<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>          public int hashCode() {<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            return e.getKey().hashCode();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          }<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>          @Override<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          public boolean equals(Object obj) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            if (obj instanceof CachedBlock) {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              return compareTo(cb) == 0;<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            } else {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>              return false;<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>            }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        };<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>      }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      @Override<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>      public void remove() {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>        throw new UnsupportedOperationException();<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>      }<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>    };<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  }<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  @Override<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  public BlockCache[] getBlockCaches() {<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    return null;<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span><a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  @Override<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    if (block.getMemoryType() == MemoryType.SHARED) {<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>      BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      if (bucketEntry != null) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>        int refCount = bucketEntry.decrementRefCountAndGet();<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        if (refCount == 0 &amp;&amp; bucketEntry.isMarkedForEvict()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          forceEvict(cacheKey);<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      }<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>  @VisibleForTesting<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>    if (bucketEntry != null) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      return bucketEntry.getRefCount();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    }<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    return 0;<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span><a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>  float getAcceptableFactor() {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    return acceptableFactor;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span><a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>  float getMinFactor() {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    return minFactor;<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>  float getExtraFreeFactor() {<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    return extraFreeFactor;<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>  }<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span><a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>  float getSingleFactor() {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    return singleFactor;<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  float getMultiFactor() {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    return multiFactor;<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>  }<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  float getMemoryFactor() {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    return memoryFactor;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>}<a name="line.1717"></a>
+<span class="sourceLineNo">1084</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  private void persistToFile() throws IOException {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    assert !cacheEnabled;<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>    if (!ioEngine.isPersistent()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<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>   * @see #persistToFile()<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   */<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    File persistenceFile = new File(persistencePath);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    if (!persistenceFile.exists()) {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    assert !cacheEnabled;<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      byte[] pbuf = new byte[pblen];<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      int read = in.read(pbuf);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      if (read != pblen) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            persistencePath);<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  /**<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>   * &lt;pre&gt;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>   *   File f = ...<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   *     // use the input stream<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   *   } finally {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>   *   }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   * &lt;/pre&gt;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @param file the file to read and delete<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>   * @return a FileInputStream for the given file<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>   * @throws IOException if there is a problem creating the stream<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>   */<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    return new FileInputStream(file) {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      public void close() throws IOException {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>        super.close();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>        if (!file.delete()) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>        }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    };<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>      throws IOException {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    if (capacitySize != cacheCapacity) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>          + ", expected:" + backingMap.getClass().getName());<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>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  /**<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * cache<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private void checkIOErrorIsTolerated() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        disableCache();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    } else {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      this.ioErrorStartTime = now;<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>    }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>  }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  private void disableCache() {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!cacheEnabled) return;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    cacheEnabled = false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    ioEngine.shutdown();<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.scheduleThreadPool.shutdown();<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    this.ramCache.clear();<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      this.backingMap.clear();<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>  }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>  private void join() throws InterruptedException {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      writerThreads[i].join();<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  public void shutdown() {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    disableCache();<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        + "; path to write=" + persistencePath);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      try {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>        join();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>        persistToFile();<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      } catch (IOException ex) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      } catch (InterruptedException e) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public CacheStats getStats() {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return cacheStats;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  public BucketAllocator getAllocator() {<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    return this.bucketAllocator;<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>  @Override<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  public long heapSize() {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    return this.heapSize.sum();<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  @Override<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public long size() {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    return this.realCacheSize.sum();<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  @Override<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>  public long getCurrentDataSize() {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    return size();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>  }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  public long getFreeSize() {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    return this.bucketAllocator.getFreeSize();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span><a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  @Override<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  public long getBlockCount() {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    return this.blockNumber.sum();<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>  @Override<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  public long getDataBlockCount() {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    return getBlockCount();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  public long getCurrentSize() {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    return this.bucketAllocator.getUsedSize();<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>  }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span><a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>  /**<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * Evicts all blocks for a specific HFile.<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * &lt;p&gt;<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   *<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>   * @return the number of blocks evicted<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span><a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    int numEvicted = 0;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    for (BlockCacheKey key : keySet) {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (evictBlock(key)) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>          ++numEvicted;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span><a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    return numEvicted;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>  }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>  /**<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   */<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  static class BucketEntry implements Serializable {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    // access counter comparator, descending order<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span><a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private int offsetBase;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private int length;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private byte offset1;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span><a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    /**<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>     */<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    byte deserialiserIndex;<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    private volatile long accessCounter;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    private BlockPriority priority;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span><a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    /**<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>     */<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    private final long cachedTime = System.nanoTime();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      setOffset(offset);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.length = length;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      this.accessCounter = accessCounter;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      if (inMemory) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.MEMORY;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      } else {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        this.priority = BlockPriority.SINGLE;<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    long offset() { // Java has no unsigned numbers<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      return o &lt;&lt; 8;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    private void setOffset(long value) {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      assert (value &amp; 0xFF) == 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      value &gt;&gt;= 8;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      offsetBase = (int) value;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    public int getLength() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return length;<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>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span><a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    public long getAccessCounter() {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      return accessCounter;<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    }<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span><a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    /**<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>     * Block has been accessed. Update its local access counter.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     */<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    public void access(long accessCounter) {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      this.accessCounter = accessCounter;<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        this.priority = BlockPriority.MULTI;<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    public BlockPriority getPriority() {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      return this.priority;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    public long getCachedTime() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      return cachedTime;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    protected int getRefCount() {<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      return 0;<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    }<a n

<TRUNCATED>

[10/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
index 740e531..7aea77c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
@@ -32,411 +32,519 @@
 <span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Random;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Set;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.TreeSet;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.stream.Collectors;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.commons.io.IOUtils;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.ChoreService;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HConstants;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.ScheduledChore;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.Stoppable;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.TableName;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Get;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Put;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Result;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Table;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.PairOfSameType;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.util.StoppableImplementation;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.AfterClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.BeforeClass;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.ClassRule;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Rule;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.rules.TestName;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.slf4j.Logger;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.slf4j.LoggerFactory;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterators;<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>@Category(LargeTests.class)<a name="line.70"></a>
-<span class="sourceLineNo">071</span>public class TestEndToEndSplitTransaction {<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  @ClassRule<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      HBaseClassTestRule.forClass(TestEndToEndSplitTransaction.class);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(TestEndToEndSplitTransaction.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final Configuration CONF = TEST_UTIL.getConfiguration();<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  @Rule<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public TestName name = new TestName();<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  @BeforeClass<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public static void beforeAllTests() throws Exception {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    TEST_UTIL.startMiniCluster();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
+<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Random;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Set;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.TreeSet;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.stream.Collectors;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.commons.io.IOUtils;<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.hbase.ChoreService;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HConstants;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.ScheduledChore;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.Stoppable;<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.client.Admin;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Get;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Put;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Result;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Table;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<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.PairOfSameType;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.util.StoppableImplementation;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterators;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.junit.AfterClass;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.Assert;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.BeforeClass;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.junit.ClassRule;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.Rule;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Test;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.experimental.categories.Category;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.rules.TestName;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.slf4j.Logger;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.slf4j.LoggerFactory;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>@Category(LargeTests.class)<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class TestEndToEndSplitTransaction {<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  @ClassRule<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      HBaseClassTestRule.forClass(TestEndToEndSplitTransaction.class);<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(TestEndToEndSplitTransaction.class);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final Configuration CONF = TEST_UTIL.getConfiguration();<a name="line.88"></a>
 <span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  @AfterClass<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public static void afterAllTests() throws Exception {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * Tests that the client sees meta table changes as atomic during splits<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public void testFromClientSideWhileSplitting() throws Throwable {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    LOG.info("Starting testFromClientSideWhileSplitting");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    final byte[] FAMILY = Bytes.toBytes("family");<a name="line.102"></a>
+<span class="sourceLineNo">090</span>  @Rule<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public TestName name = new TestName();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @BeforeClass<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static void beforeAllTests() throws Exception {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    TEST_UTIL.startMiniCluster();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  @AfterClass<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static void afterAllTests() throws Exception {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
 <span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //SplitTransaction will update the meta table by offlining the parent region, and adding info<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    //for daughters.<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    Table table = TEST_UTIL.createTable(tableName, FAMILY);<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>    Stoppable stopper = new StoppableImplementation();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    RegionSplitter regionSplitter = new RegionSplitter(table);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    RegionChecker regionChecker = new RegionChecker(CONF, stopper, tableName);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    final ChoreService choreService = new ChoreService("TEST_SERVER");<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>    choreService.scheduleChore(regionChecker);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    regionSplitter.start();<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    //wait until the splitter is finished<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    regionSplitter.join();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    stopper.stop(null);<a name="line.118"></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>   * This is the test for : HBASE-20940 This test will split the region and try to open an reference<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * over store file. Once store file has any reference, it makes sure that region can't be split<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * @throws Exception<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public void testCanSplitJustAfterASplit() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    LOG.info("Starting testCanSplitJustAfterASplit");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    byte[] fam = Bytes.toBytes("cf_split");<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>    TableName tableName = TableName.valueOf("CanSplitTable");<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    Table source = TEST_UTIL.getConnection().getTable(tableName);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    Map&lt;String, StoreFileReader&gt; scanner = Maps.newHashMap();<a name="line.118"></a>
 <span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (regionChecker.ex != null) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      throw new AssertionError("regionChecker", regionChecker.ex);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">120</span>    try {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      TableDescriptor htd = TableDescriptorBuilder.newBuilder(tableName)<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          .setColumnFamily(ColumnFamilyDescriptorBuilder.of(fam)).build();<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (regionSplitter.ex != null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      throw new AssertionError("regionSplitter", regionSplitter.ex);<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>    //one final check<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    regionChecker.verify();<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>  static class RegionSplitter extends Thread {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    final Connection connection;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    Throwable ex;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    Table table;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TableName tableName;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    byte[] family;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Admin admin;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    HRegionServer rs;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    RegionSplitter(Table table) throws IOException {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      this.table = table;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      this.tableName = table.getName();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      this.family = table.getTableDescriptor().getFamiliesKeys().iterator().next();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      admin = TEST_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      connection = TEST_UTIL.getConnection();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void run() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      try {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        Random random = new Random();<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        for (int i= 0; i&lt; 5; i++) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          List&lt;RegionInfo&gt; regions =<a name="line.155"></a>
-<span class="sourceLineNo">156</span>              MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          if (regions.isEmpty()) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>            continue;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>          }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>          int regionIndex = random.nextInt(regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>          //pick a random region and split it into two<a name="line.162"></a>
-<span class="sourceLineNo">163</span>          RegionInfo region = Iterators.get(regions.iterator(), regionIndex);<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>          //pick the mid split point<a name="line.165"></a>
-<span class="sourceLineNo">166</span>          int start = 0, end = Integer.MAX_VALUE;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          if (region.getStartKey().length &gt; 0) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>            start = Bytes.toInt(region.getStartKey());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          if (region.getEndKey().length &gt; 0) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>            end = Bytes.toInt(region.getEndKey());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          int mid = start + ((end - start) / 2);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          byte[] splitPoint = Bytes.toBytes(mid);<a name="line.174"></a>
+<span class="sourceLineNo">124</span>      admin.createTable(htd);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      TEST_UTIL.loadTable(source, fam);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      List&lt;HRegion&gt; regions = TEST_UTIL.getHBaseCluster().getRegions(tableName);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      regions.get(0).forceSplit(null);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      admin.split(tableName);<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>      while (regions.size() &lt;= 1) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        regions = TEST_UTIL.getHBaseCluster().getRegions(tableName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        regions.stream()<a name="line.132"></a>
+<span class="sourceLineNo">133</span>            .forEach(r -&gt; r.getStores().get(0).getStorefiles().stream()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                .filter(<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                  s -&gt; s.isReference() &amp;&amp; !scanner.containsKey(r.getRegionInfo().getEncodedName()))<a name="line.135"></a>
+<span class="sourceLineNo">136</span>                .forEach(sf -&gt; {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>                  StoreFileReader reader = ((HStoreFile) sf).getReader();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                  reader.getStoreFileScanner(true, false, false, 0, 0, false);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>                  scanner.put(r.getRegionInfo().getEncodedName(), reader);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>                  LOG.info("Got reference to file = " + sf.getPath() + ",for region = "<a name="line.140"></a>
+<span class="sourceLineNo">141</span>                      + r.getRegionInfo().getEncodedName());<a name="line.141"></a>
+<span class="sourceLineNo">142</span>                }));<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>      Assert.assertTrue("Regions did not split properly", regions.size() &gt; 1);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      Assert.assertTrue("Could not get reference any of the store file", scanner.size() &gt; 1);<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>      RetryCounter retrier = new RetryCounter(30, 1, TimeUnit.SECONDS);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      while (CompactionState.NONE != admin.getCompactionState(tableName) &amp;&amp; retrier.shouldRetry()) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        retrier.sleepUntilNextRetry();<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>      Assert.assertEquals("Compaction did not complete in 30 secs", CompactionState.NONE,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        admin.getCompactionState(tableName));<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>      regions.stream()<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          .filter(region -&gt; scanner.containsKey(region.getRegionInfo().getEncodedName()))<a name="line.157"></a>
+<span class="sourceLineNo">158</span>          .forEach(r -&gt; Assert.assertTrue("Contains an open file reference which can be split",<a name="line.158"></a>
+<span class="sourceLineNo">159</span>            !r.getStores().get(0).canSplit()));<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    } finally {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      scanner.values().stream().forEach(s -&gt; {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        try {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          s.close(true);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        } catch (IOException ioe) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          LOG.error("Failed while closing store file", ioe);<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>      scanner.clear();<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      if (source != null) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        source.close();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      TEST_UTIL.deleteTableIfAny(tableName);<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><a name="line.175"></a>
-<span class="sourceLineNo">176</span>          //put some rows to the regions<a name="line.176"></a>
-<span class="sourceLineNo">177</span>          addData(start);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>          addData(mid);<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>          flushAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          compactAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>          log("Initiating region split for:" + region.getRegionNameAsString());<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>            admin.splitRegion(region.getRegionName(), splitPoint);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>            //wait until the split is complete<a name="line.186"></a>
-<span class="sourceLineNo">187</span>            blockUntilRegionSplit(CONF, 50000, region.getRegionName(), true);<a name="line.187"></a>
+<span class="sourceLineNo">176</span>  /**<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * Tests that the client sees meta table changes as atomic during splits<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Test<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void testFromClientSideWhileSplitting() throws Throwable {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    LOG.info("Starting testFromClientSideWhileSplitting");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    final byte[] FAMILY = Bytes.toBytes("family");<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>    //SplitTransaction will update the meta table by offlining the parent region, and adding info<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    //for daughters.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    Table table = TEST_UTIL.createTable(tableName, FAMILY);<a name="line.187"></a>
 <span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>          } catch (NotServingRegionException ex) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>            //ignore<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>      } catch (Throwable ex) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        this.ex = ex;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>    void addData(int start) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      for (int i=start; i&lt; start + 100; i++) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        put.addColumn(family, family, Bytes.toBytes(i));<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        puts.add(put);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      table.put(puts);<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">189</span>    Stoppable stopper = new StoppableImplementation();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    RegionSplitter regionSplitter = new RegionSplitter(table);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    RegionChecker regionChecker = new RegionChecker(CONF, stopper, tableName);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    final ChoreService choreService = new ChoreService("TEST_SERVER");<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    choreService.scheduleChore(regionChecker);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    regionSplitter.start();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    //wait until the splitter is finished<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    regionSplitter.join();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    stopper.stop(null);<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (regionChecker.ex != null) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      throw new AssertionError("regionChecker", regionChecker.ex);<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>    if (regionSplitter.ex != null) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      throw new AssertionError("regionSplitter", regionSplitter.ex);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Checks regions using MetaTableAccessor and HTable methods<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  static class RegionChecker extends ScheduledChore {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    Connection connection;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Configuration conf;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    TableName tableName;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    Throwable ex;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    RegionChecker(Configuration conf, Stoppable stopper, TableName tableName) throws IOException {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      super("RegionChecker", stopper, 10);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.conf = conf;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      this.tableName = tableName;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>      this.connection = ConnectionFactory.createConnection(conf);<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>    /** verify region boundaries obtained from MetaScanner */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    void verifyRegionsUsingMetaTableAccessor() throws Exception {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      List&lt;RegionInfo&gt; regionList = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      verifyTableRegions(regionList.stream().collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      regionList = MetaTableAccessor.getAllRegions(connection, true);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      verifyTableRegions(regionList.stream().collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<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>    /** verify region boundaries obtained from HTable.getStartEndKeys() */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    void verifyRegionsUsingHTable() throws IOException {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      Table table = null;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        //HTable.getStartEndKeys()<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        table = connection.getTable(tableName);<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>        try(RegionLocator rl = connection.getRegionLocator(tableName)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          Pair&lt;byte[][], byte[][]&gt; keys = rl.getStartEndKeys();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          verifyStartEndKeys(keys);<a name="line.243"></a>
+<span class="sourceLineNo">209</span>    //one final check<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    regionChecker.verify();<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>  static class RegionSplitter extends Thread {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    final Connection connection;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    Throwable ex;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    Table table;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    TableName tableName;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    byte[] family;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    Admin admin;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    HRegionServer rs;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    RegionSplitter(Table table) throws IOException {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      this.table = table;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      this.tableName = table.getName();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      this.family = table.getTableDescriptor().getFamiliesKeys().iterator().next();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      admin = TEST_UTIL.getAdmin();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      connection = TEST_UTIL.getConnection();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    public void run() {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        Random random = new Random();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        for (int i = 0; i &lt; 5; i++) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>          List&lt;RegionInfo&gt; regions = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>          if (regions.isEmpty()) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            continue;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          int regionIndex = random.nextInt(regions.size());<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>          // pick a random region and split it into two<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          RegionInfo region = Iterators.get(regions.iterator(), regionIndex);<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>          Set&lt;RegionInfo&gt; regions = new TreeSet&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          for (HRegionLocation loc : rl.getAllRegionLocations()) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            regions.add(loc.getRegionInfo());<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          verifyTableRegions(regions);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>      } finally {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        IOUtils.closeQuietly(table);<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>    void verify() throws Exception {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      verifyRegionsUsingMetaTableAccessor();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      verifyRegionsUsingHTable();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    void verifyTableRegions(Set&lt;RegionInfo&gt; regions) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      log("Verifying " + regions.size() + " regions: " + regions);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>      byte[][] startKeys = new byte[regions.size()][];<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      byte[][] endKeys = new byte[regions.size()][];<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>      int i=0;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (RegionInfo region : regions) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        startKeys[i] = region.getStartKey();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        endKeys[i] = region.getEndKey();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        i++;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>      Pair&lt;byte[][], byte[][]&gt; keys = new Pair&lt;&gt;(startKeys, endKeys);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      verifyStartEndKeys(keys);<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>    void verifyStartEndKeys(Pair&lt;byte[][], byte[][]&gt; keys) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      byte[][] startKeys = keys.getFirst();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      byte[][] endKeys = keys.getSecond();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      assertEquals(startKeys.length, endKeys.length);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      assertTrue("Found 0 regions for the table", startKeys.length &gt; 0);<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>      assertArrayEquals("Start key for the first region is not byte[0]",<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          HConstants.EMPTY_START_ROW, startKeys[0]);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      byte[] prevEndKey = HConstants.EMPTY_START_ROW;<a name="line.287"></a>
+<span class="sourceLineNo">245</span>          // pick the mid split point<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          int start = 0, end = Integer.MAX_VALUE;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          if (region.getStartKey().length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>            start = Bytes.toInt(region.getStartKey());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          if (region.getEndKey().length &gt; 0) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>            end = Bytes.toInt(region.getEndKey());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          }<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          int mid = start + ((end - start) / 2);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          byte[] splitPoint = Bytes.toBytes(mid);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>          // put some rows to the regions<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          addData(start);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          addData(mid);<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>          flushAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          compactAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>          log("Initiating region split for:" + region.getRegionNameAsString());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            admin.splitRegion(region.getRegionName(), splitPoint);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            // wait until the split is complete<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            blockUntilRegionSplit(CONF, 50000, region.getRegionName(), true);<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>          } catch (NotServingRegionException ex) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>            // ignore<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      } catch (Throwable ex) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        this.ex = ex;<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><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    void addData(int start) throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      for (int i=start; i&lt; start + 100; i++) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        put.addColumn(family, family, Bytes.toBytes(i));<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        puts.add(put);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      table.put(puts);<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>      // ensure that we do not have any gaps<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i=0; i&lt;startKeys.length; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        assertArrayEquals(<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            "Hole in hbase:meta is detected. prevEndKey=" + Bytes.toStringBinary(prevEndKey)<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                + " ,regionStartKey=" + Bytes.toStringBinary(startKeys[i]), prevEndKey,<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            startKeys[i]);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        prevEndKey = endKeys[i];<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      assertArrayEquals("End key for the last region is not byte[0]", HConstants.EMPTY_END_ROW,<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          endKeys[endKeys.length - 1]);<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>    @Override<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    protected void chore() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        verify();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      } catch (Throwable ex) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        this.ex = ex;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        getStopper().stop("caught exception");<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><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public static void log(String msg) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    LOG.info(msg);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Checks regions using MetaTableAccessor and HTable methods<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  static class RegionChecker extends ScheduledChore {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Connection connection;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    Configuration conf;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    TableName tableName;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    Throwable ex;<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    RegionChecker(Configuration conf, Stoppable stopper, TableName tableName) throws IOException {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      super("RegionChecker", stopper, 10);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      this.conf = conf;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      this.tableName = tableName;<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      this.connection = ConnectionFactory.createConnection(conf);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    /** verify region boundaries obtained from MetaScanner */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    void verifyRegionsUsingMetaTableAccessor() throws Exception {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      List&lt;RegionInfo&gt; regionList = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      verifyTableRegions(regionList.stream()<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          .collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      regionList = MetaTableAccessor.getAllRegions(connection, true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      verifyTableRegions(regionList.stream()<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          .collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
 <span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>  /* some utility methods for split tests */<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public static void flushAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      throws IOException, InterruptedException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    log("flushing region: " + Bytes.toStringBinary(regionName));<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    admin.flushRegion(regionName);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    log("blocking until flush is complete: " + Bytes.toStringBinary(regionName));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    Threads.sleepWithoutInterrupt(500);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    while (rs.getOnlineRegion(regionName).getMemStoreDataSize() &gt; 0) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      Threads.sleep(50);<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>  public static void compactAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      throws IOException, InterruptedException {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    log("Compacting region: " + Bytes.toStringBinary(regionName));<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    admin.majorCompactRegion(regionName);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    log("blocking until compaction is complete: " + Bytes.toStringBinary(regionName));<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    Threads.sleepWithoutInterrupt(500);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    outer: for (;;) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      for (Store store : rs.getOnlineRegion(regionName).getStores()) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        if (store.getStorefilesCount() &gt; 1) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          Threads.sleep(50);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          continue outer;<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>      break;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  /** Blocks until the region split is complete in hbase:meta and region server opens the daughters */<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public static void blockUntilRegionSplit(Configuration conf, long timeout,<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      final byte[] regionName, boolean waitForDaughters)<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      throws IOException, InterruptedException {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    long start = System.currentTimeMillis();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    log("blocking until region is split:" +  Bytes.toStringBinary(regionName));<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    RegionInfo daughterA = null, daughterB = null;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      Result result = null;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      RegionInfo region = null;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      while ((System.currentTimeMillis() - start) &lt; timeout) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        result = metaTable.get(new Get(regionName));<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (result == null) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          break;<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>        region = MetaTableAccessor.getRegionInfo(result);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        if (region.isSplitParent()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          log("found parent region: " + region.toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          PairOfSameType&lt;RegionInfo&gt; pair = MetaTableAccessor.getDaughterRegions(result);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          daughterA = pair.getFirst();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          daughterB = pair.getSecond();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          break;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        Threads.sleep(100);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      if (daughterA == null || daughterB == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        throw new IOException("Failed to get daughters, daughterA=" + daughterA + ", daughterB=" +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          daughterB + ", timeout=" + timeout + ", result=" + result + ", regionName=" +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          Bytes.toString(regionName) + ", region=" + region);<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>      //if we are here, this means the region split is complete or timed out<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      if (waitForDaughters) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        long rem = timeout - (System.currentTimeMillis() - start);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        blockUntilRegionIsInMeta(conn, rem, daughterA);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        blockUntilRegionIsInMeta(conn, rem, daughterB);<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        blockUntilRegionIsOpened(conf, rem, daughterA);<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        blockUntilRegionIsOpened(conf, rem, daughterB);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>  public static void blockUntilRegionIsInMeta(Connection conn, long timeout, RegionInfo hri)<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      throws IOException, InterruptedException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    log("blocking until region is in META: " + hri.getRegionNameAsString());<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    long start = System.currentTimeMillis();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      HRegionLocation loc = MetaTableAccessor.getRegionLocation(conn, hri);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      if (loc != null &amp;&amp; !loc.getRegionInfo().isOffline()) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        log("found region in META: " + hri.getRegionNameAsString());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        break;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      Threads.sleep(10);<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>  public static void blockUntilRegionIsOpened(Configuration conf, long timeout, RegionInfo hri)<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      throws IOException, InterruptedException {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    log("blocking until region is opened for reading:" + hri.getRegionNameAsString());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    long start = System.currentTimeMillis();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        Table table = conn.getTable(hri.getTable())) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      byte[] row = hri.getStartKey();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // Check for null/empty row. If we find one, use a key that is likely to be in first region.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (row == null || row.length &lt;= 0) row = new byte[] { '0' };<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      Get get = new Get(row);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          table.get(get);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          break;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        } catch (IOException ex) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          // wait some more<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        Threads.sleep(10);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>}<a name="line.431"></a>
+<span class="sourceLineNo">316</span>    /** verify region boundaries obtained from HTable.getStartEndKeys() */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    void verifyRegionsUsingHTable() throws IOException {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      Table table = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      try {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        //HTable.getStartEndKeys()<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        table = connection.getTable(tableName);<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>        try(RegionLocator rl = connection.getRegionLocator(tableName)) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          Pair&lt;byte[][], byte[][]&gt; keys = rl.getStartEndKeys();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          verifyStartEndKeys(keys);<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>          Set&lt;RegionInfo&gt; regions = new TreeSet&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          for (HRegionLocation loc : rl.getAllRegionLocations()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            regions.add(loc.getRegionInfo());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          verifyTableRegions(regions);<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>      } finally {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        IOUtils.closeQuietly(table);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>    void verify() throws Exception {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      verifyRegionsUsingMetaTableAccessor();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      verifyRegionsUsingHTable();<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>    void verifyTableRegions(Set&lt;RegionInfo&gt; regions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      log("Verifying " + regions.size() + " regions: " + regions);<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>      byte[][] startKeys = new byte[regions.size()][];<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      byte[][] endKeys = new byte[regions.size()][];<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>      int i=0;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      for (RegionInfo region : regions) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        startKeys[i] = region.getStartKey();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        endKeys[i] = region.getEndKey();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        i++;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>      Pair&lt;byte[][], byte[][]&gt; keys = new Pair&lt;&gt;(startKeys, endKeys);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      verifyStartEndKeys(keys);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>    void verifyStartEndKeys(Pair&lt;byte[][], byte[][]&gt; keys) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      byte[][] startKeys = keys.getFirst();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      byte[][] endKeys = keys.getSecond();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      assertEquals(startKeys.length, endKeys.length);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      assertTrue("Found 0 regions for the table", startKeys.length &gt; 0);<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertArrayEquals("Start key for the first region is not byte[0]",<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          HConstants.EMPTY_START_ROW, startKeys[0]);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] prevEndKey = HConstants.EMPTY_START_ROW;<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>      // ensure that we do not have any gaps<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      for (int i=0; i&lt;startKeys.length; i++) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assertArrayEquals(<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            "Hole in hbase:meta is detected. prevEndKey=" + Bytes.toStringBinary(prevEndKey)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                + " ,regionStartKey=" + Bytes.toStringBinary(startKeys[i]), prevEndKey,<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            startKeys[i]);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        prevEndKey = endKeys[i];<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      assertArrayEquals("End key for the last region is not byte[0]", HConstants.EMPTY_END_ROW,<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          endKeys[endKeys.length - 1]);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    }<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>    @Override<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    protected void chore() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      try {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        verify();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      } catch (Throwable ex) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        this.ex = ex;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        getStopper().stop("caught exception");<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  public static void log(String msg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    LOG.info(msg);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  /* some utility methods for split tests */<a name="line.398"></a>
+<span class="sourceLineNo">399</span><a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public static void flushAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      throws IOException, InterruptedException {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    log("flushing region: " + Bytes.toStringBinary(regionName));<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    admin.flushRegion(regionName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    log("blocking until flush is complete: " + Bytes.toStringBinary(regionName));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    Threads.sleepWithoutInterrupt(500);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    while (rs.getOnlineRegion(regionName).getMemStoreDataSize() &gt; 0) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      Threads.sleep(50);<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>  public static void compactAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      throws IOException, InterruptedException {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    log("Compacting region: " + Bytes.toStringBinary(regionName));<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    admin.majorCompactRegion(regionName);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    log("blocking until compaction is complete: " + Bytes.toStringBinary(regionName));<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    Threads.sleepWithoutInterrupt(500);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    outer: for (;;) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      for (Store store : rs.getOnlineRegion(regionName).getStores()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        if (store.getStorefilesCount() &gt; 1) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          Threads.sleep(50);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          continue outer;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      break;<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><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  /**<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * Blocks until the region split is complete in hbase:meta and region server opens the daughters<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   */<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  public static void blockUntilRegionSplit(Configuration conf, long timeout,<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      final byte[] regionName, boolean waitForDaughters)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      throws IOException, InterruptedException {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    long start = System.currentTimeMillis();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    log("blocking until region is split:" +  Bytes.toStringBinary(regionName));<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    RegionInfo daughterA = null, daughterB = null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Result result = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      RegionInfo region = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      while ((System.currentTimeMillis() - start) &lt; timeout) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        result = metaTable.get(new Get(regionName));<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        if (result == null) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          break;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>        region = MetaTableAccessor.getRegionInfo(result);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        if (region.isSplitParent()) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>          log("found parent region: " + region.toString());<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          PairOfSameType&lt;RegionInfo&gt; pair = MetaTableAccessor.getDaughterRegions(result);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          daughterA = pair.getFirst();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          daughterB = pair.getSecond();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          break;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        Threads.sleep(100);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      if (daughterA == null || daughterB == null) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        throw new IOException("Failed to get daughters, daughterA=" + daughterA + ", daughterB=" +<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          daughterB + ", timeout=" + timeout + ", result=" + result + ", regionName=" +<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          Bytes.toString(regionName) + ", region=" + region);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>      //if we are here, this means the region split is complete or timed out<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      if (waitForDaughters) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        long rem = timeout - (System.currentTimeMillis() - start);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        blockUntilRegionIsInMeta(conn, rem, daughterA);<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        blockUntilRegionIsInMeta(conn, rem, daughterB);<a name="line.469"></a>
+<span class="sourceLineNo">470</span><a name="line.470"></a>
+<span class="sourceLineNo">471</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        blockUntilRegionIsOpened(conf, rem, daughterA);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        blockUntilRegionIsOpened(conf, rem, daughterB);<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>        // Compacting the new region to make sure references can be cleaned up<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        compactAndBlockUntilDone(TEST_UTIL.getAdmin(),<a name="line.478"></a>
+<span class="sourceLineNo">479</span>          TEST_UTIL.getMiniHBaseCluster().getRegionServer(0), daughterA.getRegionName());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>        compactAndBlockUntilDone(TEST_UTIL.getAdmin(),<a name="line.480"></a>
+<span class="sourceLineNo">481</span>          TEST_UTIL.getMiniHBaseCluster().getRegionServer(0), daughterB.getRegionName());<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>        removeCompactedFiles(conn, timeout, daughterA);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        removeCompactedFiles(conn, timeout, daughterB);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  public static void removeCompactedFiles(Connection conn, long timeout, RegionInfo hri)<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      throws IOException, InterruptedException {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    log("remove compacted files for : " + hri.getRegionNameAsString());<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    List&lt;HRegion&gt; regions = TEST_UTIL.getHBaseCluster().getRegions(hri.getTable());<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    regions.stream().forEach(r -&gt; {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      try {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        r.getStores().get(0).closeAndArchiveCompactedFiles();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      } catch (IOException ioe) {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>        LOG.error("failed in removing compacted file", ioe);<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    });<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>  public static void blockUntilRegionIsInMeta(Connection conn, long timeout, RegionInfo hri)<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      throws IOException, InterruptedException {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    log("blocking until region is in META: " + hri.getRegionNameAsString());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    long start = System.currentTimeMillis();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      HRegionLocation loc = MetaTableAccessor.getRegionLocation(conn, hri);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      if (loc != null &amp;&amp; !loc.getRegionInfo().isOffline()) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        log("found region in META: " + hri.getRegionNameAsString());<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        break;<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Threads.sleep(10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  public static void blockUntilRegionIsOpened(Configuration conf, long timeout, RegionInfo hri)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      throws IOException, InterruptedException {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    log("blocking until region is opened for reading:" + hri.getRegionNameAsString());<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    long start = System.currentTimeMillis();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        Table table = conn.getTable(hri.getTable())) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>      byte[] row = hri.getStartKey();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      // Check for null/empty row. If we find one, use a key that is likely to be in first region.<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (row == null || row.length &lt;= 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        row = new byte[] { '0' };<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      Get get = new Get(row);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.528"></a

<TRUNCATED>

[36/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileReader.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileReader.html b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileReader.html
index 6a1b8f2..b635526 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileReader.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileReader.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":42,"i18":42,"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};
+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":42,"i18":42,"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};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -380,55 +380,61 @@ 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/regionserver/StoreFileReader.html#getUncompressedDataIndexSize--">getUncompressedDataIndexSize</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i24" class="altColor">
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#incrementRefCount--">incrementRefCount</a></span>()</code>
+<div class="block">Indicate that the scanner has started reading with this reader.</div>
+</td>
+</tr>
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#indexSize--">indexSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#isBulkLoaded--">isBulkLoaded</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#isPrimaryReplicaReader--">isPrimaryReplicaReader</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#isSkipResetSeqId--">isSkipResetSeqId</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#length--">length</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#loadBloomfilter--">loadBloomfilter</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#loadBloomfilter-org.apache.hadoop.hbase.io.hfile.BlockType-">loadBloomfilter</a></span>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" 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;byte[],byte[]&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#loadFileInfo--">loadFileInfo</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#midKey--">midKey</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#passesBloomFilter-org.apache.hadoop.hbase.client.Scan-java.util.SortedSet-">passesBloomFilter</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                  <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;byte[]&gt;&nbsp;columns)</code>
 <div class="block">Checks whether the given scan passes the Bloom filter (if present).</div>
 </td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#passesDeleteFamilyBloomFilter-byte:A-int-int-">passesDeleteFamilyBloomFilter</a></span>(byte[]&nbsp;row,
                              int&nbsp;rowOffset,
                              int&nbsp;rowLen)</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#passesGeneralRowBloomFilter-byte:A-int-int-">passesGeneralRowBloomFilter</a></span>(byte[]&nbsp;row,
                            int&nbsp;rowOffset,
@@ -436,19 +442,19 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="block">A method for checking Bloom filters.</div>
 </td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#passesGeneralRowColBloomFilter-org.apache.hadoop.hbase.Cell-">passesGeneralRowColBloomFilter</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>
 <div class="block">A method for checking Bloom filters.</div>
 </td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#passesKeyRangeFilter-org.apache.hadoop.hbase.client.Scan-">passesKeyRangeFilter</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
 <div class="block">Checks whether the given scan rowkey range overlaps with the current storefile's</div>
 </td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#passesTimerangeFilter-org.apache.hadoop.hbase.io.TimeRange-long-">passesTimerangeFilter</a></span>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr,
                      long&nbsp;oldestUnexpiredTS)</code>
@@ -456,33 +462,33 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  have not expired (i.e.</div>
 </td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#readCompleted--">readCompleted</a></span>()</code>
 <div class="block">Indicate that the scanner has finished reading with this reader.</div>
 </td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#setBloomFilterFaulty-org.apache.hadoop.hbase.io.hfile.BlockType-">setBloomFilterFaulty</a></span>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#setBulkLoaded-boolean-">setBulkLoaded</a></span>(boolean&nbsp;bulkLoadResult)</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#setDeleteFamilyBloomFilterFaulty--">setDeleteFamilyBloomFilterFaulty</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#setGeneralBloomFilterFaulty--">setGeneralBloomFilterFaulty</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#setSequenceID-long-">setSequenceID</a></span>(long&nbsp;sequenceID)</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html#setSkipResetSeqId-boolean-">setSkipResetSeqId</a></span>(boolean&nbsp;skipResetSeqId)</code>&nbsp;</td>
 </tr>
@@ -767,13 +773,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="incrementRefCount--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>incrementRefCount</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.159">incrementRefCount</a>()</pre>
+<div class="block">Indicate that the scanner has started reading with this reader. We need to increment the ref
+ count so reader is not close until some object is holding the lock</div>
+</li>
+</ul>
 <a name="readCompleted--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>readCompleted</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.161">readCompleted</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.167">readCompleted</a>()</pre>
 <div class="block">Indicate that the scanner has finished reading with this reader. We need to decrement the ref
  count, and also, if this is not the common pread reader, we should close it.</div>
 </li>
@@ -785,7 +802,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <li class="blockList">
 <h4>getScanner</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="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.182">getScanner</a>(boolean&nbsp;cacheBlocks,
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.188">getScanner</a>(boolean&nbsp;cacheBlocks,
                                            boolean&nbsp;pread)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Do not write further code which depends on this call. Instead
    use getStoreFileScanner() which uses the StoreFileScanner class/interface
@@ -806,7 +823,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <li class="blockList">
 <h4>getScanner</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="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.200">getScanner</a>(boolean&nbsp;cacheBlocks,
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.206">getScanner</a>(boolean&nbsp;cacheBlocks,
                                            boolean&nbsp;pread,
                                            boolean&nbsp;isCompaction)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Do not write further code which depends on this call. Instead
@@ -828,7 +845,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.205">close</a>(boolean&nbsp;evictOnClose)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.211">close</a>(boolean&nbsp;evictOnClose)
            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>
@@ -842,7 +859,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>passesTimerangeFilter</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.217">passesTimerangeFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.223">passesTimerangeFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr,
                               long&nbsp;oldestUnexpiredTS)</pre>
 <div class="block">Check if this storeFile may contain keys within the TimeRange that
  have not expired (i.e. not older than oldestUnexpiredTS).</div>
@@ -862,7 +879,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>passesBloomFilter</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.238">passesBloomFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.244">passesBloomFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                           <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;byte[]&gt;&nbsp;columns)</pre>
 <div class="block">Checks whether the given scan passes the Bloom filter (if present). Only
  checks Bloom filters for single-row or single-row-column scans. Bloom
@@ -889,7 +906,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>passesDeleteFamilyBloomFilter</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.267">passesDeleteFamilyBloomFilter</a>(byte[]&nbsp;row,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.273">passesDeleteFamilyBloomFilter</a>(byte[]&nbsp;row,
                                              int&nbsp;rowOffset,
                                              int&nbsp;rowLen)</pre>
 </li>
@@ -900,7 +917,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>passesGeneralRowBloomFilter</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.302">passesGeneralRowBloomFilter</a>(byte[]&nbsp;row,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.308">passesGeneralRowBloomFilter</a>(byte[]&nbsp;row,
                                            int&nbsp;rowOffset,
                                            int&nbsp;rowLen)</pre>
 <div class="block">A method for checking Bloom filters. Called directly from
@@ -917,7 +934,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>passesGeneralRowColBloomFilter</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.326">passesGeneralRowColBloomFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.332">passesGeneralRowColBloomFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <div class="block">A method for checking Bloom filters. Called directly from
  StoreFileScanner in case of a multi-column query.</div>
 <dl>
@@ -934,7 +951,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>checkGeneralBloomFilter</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.342">checkGeneralBloomFilter</a>(byte[]&nbsp;key,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.348">checkGeneralBloomFilter</a>(byte[]&nbsp;key,
                                         <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kvKey,
                                         <a href="../../../../../org/apache/hadoop/hbase/util/BloomFilter.html" title="interface in org.apache.hadoop.hbase.util">BloomFilter</a>&nbsp;bloomFilter)</pre>
 </li>
@@ -945,7 +962,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>passesKeyRangeFilter</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.419">passesKeyRangeFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.425">passesKeyRangeFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</pre>
 <div class="block">Checks whether the given scan rowkey range overlaps with the current storefile's</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -961,7 +978,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>loadFileInfo</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[],byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.441">loadFileInfo</a>()
+<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[],byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.447">loadFileInfo</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -975,7 +992,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>loadBloomfilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.461">loadBloomfilter</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.467">loadBloomfilter</a>()</pre>
 </li>
 </ul>
 <a name="loadBloomfilter-org.apache.hadoop.hbase.io.hfile.BlockType-">
@@ -984,7 +1001,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>loadBloomfilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.466">loadBloomfilter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.472">loadBloomfilter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)</pre>
 </li>
 </ul>
 <a name="setBloomFilterFaulty-org.apache.hadoop.hbase.io.hfile.BlockType-">
@@ -993,7 +1010,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>setBloomFilterFaulty</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.515">setBloomFilterFaulty</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.521">setBloomFilterFaulty</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)</pre>
 </li>
 </ul>
 <a name="getFilterEntries--">
@@ -1002,7 +1019,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getFilterEntries</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.530">getFilterEntries</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.536">getFilterEntries</a>()</pre>
 <div class="block">The number of Bloom filter entries in this store file, or an estimate
  thereof, if the Bloom filter is not loaded. This always returns an upper
  bound of the number of Bloom filter entries.</div>
@@ -1018,7 +1035,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>setGeneralBloomFilterFaulty</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.535">setGeneralBloomFilterFaulty</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.541">setGeneralBloomFilterFaulty</a>()</pre>
 </li>
 </ul>
 <a name="setDeleteFamilyBloomFilterFaulty--">
@@ -1027,7 +1044,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>setDeleteFamilyBloomFilterFaulty</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.539">setDeleteFamilyBloomFilterFaulty</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.545">setDeleteFamilyBloomFilterFaulty</a>()</pre>
 </li>
 </ul>
 <a name="getLastKey--">
@@ -1036,7 +1053,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastKey</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.543">getLastKey</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.549">getLastKey</a>()</pre>
 </li>
 </ul>
 <a name="getLastRowKey--">
@@ -1045,7 +1062,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastRowKey</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.547">getLastRowKey</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.553">getLastRowKey</a>()</pre>
 </li>
 </ul>
 <a name="midKey--">
@@ -1054,7 +1071,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>midKey</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.551">midKey</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.557">midKey</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1068,7 +1085,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>length</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.555">length</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.561">length</a>()</pre>
 </li>
 </ul>
 <a name="getTotalUncompressedBytes--">
@@ -1077,7 +1094,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalUncompressedBytes</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.559">getTotalUncompressedBytes</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.565">getTotalUncompressedBytes</a>()</pre>
 </li>
 </ul>
 <a name="getEntries--">
@@ -1086,7 +1103,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getEntries</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.563">getEntries</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.569">getEntries</a>()</pre>
 </li>
 </ul>
 <a name="getDeleteFamilyCnt--">
@@ -1095,7 +1112,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getDeleteFamilyCnt</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.567">getDeleteFamilyCnt</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.573">getDeleteFamilyCnt</a>()</pre>
 </li>
 </ul>
 <a name="getFirstKey--">
@@ -1104,7 +1121,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getFirstKey</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.571">getFirstKey</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.577">getFirstKey</a>()</pre>
 </li>
 </ul>
 <a name="indexSize--">
@@ -1113,7 +1130,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>indexSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.575">indexSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.581">indexSize</a>()</pre>
 </li>
 </ul>
 <a name="getBloomFilterType--">
@@ -1122,7 +1139,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getBloomFilterType</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver">BloomType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.579">getBloomFilterType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver">BloomType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.585">getBloomFilterType</a>()</pre>
 </li>
 </ul>
 <a name="getSequenceID--">
@@ -1131,7 +1148,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getSequenceID</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.583">getSequenceID</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.589">getSequenceID</a>()</pre>
 </li>
 </ul>
 <a name="setSequenceID-long-">
@@ -1140,7 +1157,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>setSequenceID</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.587">setSequenceID</a>(long&nbsp;sequenceID)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.593">setSequenceID</a>(long&nbsp;sequenceID)</pre>
 </li>
 </ul>
 <a name="setBulkLoaded-boolean-">
@@ -1149,7 +1166,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>setBulkLoaded</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.591">setBulkLoaded</a>(boolean&nbsp;bulkLoadResult)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.597">setBulkLoaded</a>(boolean&nbsp;bulkLoadResult)</pre>
 </li>
 </ul>
 <a name="isBulkLoaded--">
@@ -1158,7 +1175,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>isBulkLoaded</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.595">isBulkLoaded</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.601">isBulkLoaded</a>()</pre>
 </li>
 </ul>
 <a name="getGeneralBloomFilter--">
@@ -1167,7 +1184,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getGeneralBloomFilter</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/util/BloomFilter.html" title="interface in org.apache.hadoop.hbase.util">BloomFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.599">getGeneralBloomFilter</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/util/BloomFilter.html" title="interface in org.apache.hadoop.hbase.util">BloomFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.605">getGeneralBloomFilter</a>()</pre>
 </li>
 </ul>
 <a name="getUncompressedDataIndexSize--">
@@ -1176,7 +1193,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getUncompressedDataIndexSize</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.603">getUncompressedDataIndexSize</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.609">getUncompressedDataIndexSize</a>()</pre>
 </li>
 </ul>
 <a name="getTotalBloomSize--">
@@ -1185,7 +1202,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalBloomSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.607">getTotalBloomSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.613">getTotalBloomSize</a>()</pre>
 </li>
 </ul>
 <a name="getHFileVersion--">
@@ -1194,7 +1211,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileVersion</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.613">getHFileVersion</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.619">getHFileVersion</a>()</pre>
 </li>
 </ul>
 <a name="getHFileMinorVersion--">
@@ -1203,7 +1220,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileMinorVersion</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.617">getHFileMinorVersion</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.623">getHFileMinorVersion</a>()</pre>
 </li>
 </ul>
 <a name="getHFileReader--">
@@ -1212,7 +1229,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.621">getHFileReader</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.627">getHFileReader</a>()</pre>
 </li>
 </ul>
 <a name="disableBloomFilterForTesting--">
@@ -1221,7 +1238,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>disableBloomFilterForTesting</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.625">disableBloomFilterForTesting</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.631">disableBloomFilterForTesting</a>()</pre>
 </li>
 </ul>
 <a name="getMaxTimestamp--">
@@ -1230,7 +1247,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxTimestamp</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.630">getMaxTimestamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.636">getMaxTimestamp</a>()</pre>
 </li>
 </ul>
 <a name="isSkipResetSeqId--">
@@ -1239,7 +1256,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockList">
 <li class="blockList">
 <h4>isSkipResetSeqId</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.634">isSkipResetSeqId</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.640">isSkipResetSeqId</a>()</pre>
 </li>
 </ul>
 <a name="setSkipResetSeqId-boolean-">
@@ -1248,7 +1265,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanne
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setSkipResetSeqId</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.638">setSkipResetSeqId</a>(boolean&nbsp;skipResetSeqId)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html#line.644">setSkipResetSeqId</a>(boolean&nbsp;skipResetSeqId)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
index 26dff49..3b7a244 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
@@ -629,7 +629,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>isPrimaryReplica</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.99">isPrimaryReplica</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.100">isPrimaryReplica</a>()</pre>
 </li>
 </ul>
 <a name="getScannersForStoreFiles-java.util.Collection-boolean-boolean-long-">
@@ -638,7 +638,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getScannersForStoreFiles</h4>
-<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.106">getScannersForStoreFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.107">getScannersForStoreFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
                                                               boolean&nbsp;cacheBlocks,
                                                               boolean&nbsp;usePread,
                                                               long&nbsp;readPt)
@@ -656,7 +656,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getScannersForStoreFiles</h4>
-<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.114">getScannersForStoreFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.115">getScannersForStoreFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
                                                               boolean&nbsp;cacheBlocks,
                                                               boolean&nbsp;usePread,
                                                               boolean&nbsp;isCompaction,
@@ -676,7 +676,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getScannersForStoreFiles</h4>
-<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.125">getScannersForStoreFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.126">getScannersForStoreFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
                                                               boolean&nbsp;cacheBlocks,
                                                               boolean&nbsp;usePread,
                                                               boolean&nbsp;isCompaction,
@@ -698,7 +698,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getScannersForCompaction</h4>
-<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.168">getScannersForCompaction</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+<pre>public static&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/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.169">getScannersForCompaction</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
                                                               boolean&nbsp;canUseDropBehind,
                                                               long&nbsp;readPt)
                                                        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>
@@ -716,7 +716,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <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/regionserver/StoreFileScanner.html#line.191">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/regionserver/StoreFileScanner.html#line.192">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>
@@ -729,7 +729,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>peek</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.196">peek</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.197">peek</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#peek--">KeyValueScanner</a></code></span></div>
 <div class="block">Look at the next Cell in this scanner, but do not iterate scanner.
  NOTICE: The returned cell has not been passed into ScanQueryMatcher. So it may not be what the
@@ -748,7 +748,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.201">next</a>()
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.202">next</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 interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#next--">KeyValueScanner</a></code></span></div>
 <div class="block">Return the next Cell in this scanner, iterating the scanner</div>
@@ -768,7 +768,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>seek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.222">seek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.223">seek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
              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/regionserver/KeyValueScanner.html#seek-org.apache.hadoop.hbase.Cell-">KeyValueScanner</a></code></span></div>
 <div class="block">Seek the scanner at or after the specified KeyValue.</div>
@@ -790,7 +790,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.250">reseek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.251">reseek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
                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/regionserver/KeyValueScanner.html#reseek-org.apache.hadoop.hbase.Cell-">KeyValueScanner</a></code></span></div>
 <div class="block">Reseek the scanner at or after the specified KeyValue.
@@ -815,7 +815,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>setCurrentCell</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.277">setCurrentCell</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;newVal)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.278">setCurrentCell</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;newVal)
                        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>
@@ -829,7 +829,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>skipKVsNewerThanReadpoint</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.284">skipKVsNewerThanReadpoint</a>()
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.285">skipKVsNewerThanReadpoint</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -843,7 +843,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.307">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.308">close</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#close--">KeyValueScanner</a></code></span></div>
 <div class="block">Close the KeyValue scanner.</div>
 <dl>
@@ -862,7 +862,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>seekAtOrAfter</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.324">seekAtOrAfter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;s,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.325">seekAtOrAfter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;s,
                                     <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;k)
                              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>
@@ -882,7 +882,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>reseekAtOrAfter</h4>
-<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.343">reseekAtOrAfter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;s,
+<pre>static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.344">reseekAtOrAfter</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;s,
                                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;k)
                         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>
@@ -897,7 +897,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getScannerOrder</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.369">getScannerOrder</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.370">getScannerOrder</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getScannerOrder--">KeyValueScanner</a></code></span></div>
 <div class="block">Get the order of this KeyValueScanner. This is only relevant for StoreFileScanners.
  This is required for comparing multiple files to find out which one has the latest
@@ -916,7 +916,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>requestSeek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.388">requestSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.389">requestSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv,
                            boolean&nbsp;forward,
                            boolean&nbsp;useBloom)
                     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>
@@ -948,7 +948,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getReader</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.449">getReader</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.450">getReader</a>()</pre>
 </li>
 </ul>
 <a name="getComparator--">
@@ -957,7 +957,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getComparator</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.453">getComparator</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.454">getComparator</a>()</pre>
 </li>
 </ul>
 <a name="realSeekDone--">
@@ -966,7 +966,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>realSeekDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.458">realSeekDone</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.459">realSeekDone</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#realSeekDone--">KeyValueScanner</a></code></span></div>
 <div class="block">We optimize our store scanners by checking the most recent store file
  first, so we sometimes pretend we have done a seek but delay it until the
@@ -984,7 +984,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>enforceSeek</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.463">enforceSeek</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.464">enforceSeek</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 interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#enforceSeek--">KeyValueScanner</a></code></span></div>
 <div class="block">Does the real seek operation in case it was skipped by
@@ -1006,7 +1006,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>isFileScanner</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.475">isFileScanner</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.476">isFileScanner</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#isFileScanner--">isFileScanner</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></dd>
@@ -1022,7 +1022,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getFilePath</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.480">getFilePath</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.481">getFilePath</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getFilePath--">getFilePath</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></dd>
@@ -1039,7 +1039,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getSeekCount</h4>
-<pre>static final&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.485">getSeekCount</a>()</pre>
+<pre>static final&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.486">getSeekCount</a>()</pre>
 </li>
 </ul>
 <a name="instrument--">
@@ -1048,7 +1048,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>instrument</h4>
-<pre>static final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.489">instrument</a>()</pre>
+<pre>static final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.490">instrument</a>()</pre>
 </li>
 </ul>
 <a name="shouldUseScanner-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.HStore-long-">
@@ -1057,7 +1057,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldUseScanner</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.494">shouldUseScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.495">shouldUseScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                                 long&nbsp;oldestUnexpiredTS)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#shouldUseScanner-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.HStore-long-">KeyValueScanner</a></code></span></div>
@@ -1082,7 +1082,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>seekToPreviousRow</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.506">seekToPreviousRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;originalKey)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.507">seekToPreviousRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;originalKey)
                           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/regionserver/KeyValueScanner.html#seekToPreviousRow-org.apache.hadoop.hbase.Cell-">KeyValueScanner</a></code></span></div>
 <div class="block">Seek the scanner at the first Cell of the row which is the previous row
@@ -1106,7 +1106,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>seekToLastRow</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.557">seekToLastRow</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.558">seekToLastRow</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 interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#seekToLastRow--">KeyValueScanner</a></code></span></div>
 <div class="block">Seek the scanner at the first KeyValue of last row</div>
@@ -1127,7 +1127,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>backwardSeek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.571">backwardSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.572">backwardSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
                      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/regionserver/KeyValueScanner.html#backwardSeek-org.apache.hadoop.hbase.Cell-">KeyValueScanner</a></code></span></div>
 <div class="block">Seek the scanner at or before the row of specified Cell, it firstly
@@ -1154,7 +1154,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextIndexedKey</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.581">getNextIndexedKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.582">getNextIndexedKey</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getNextIndexedKey--">getNextIndexedKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></dd>
@@ -1171,7 +1171,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockListLast">
 <li class="blockList">
 <h4>shipped</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.586">shipped</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html#line.587">shipped</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 interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html#shipped--">Shipper</a></code></span></div>
 <div class="block">Called after a batch of rows scanned and set to be returned to client. Any in between cleanup

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/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 0094c11..b23f80b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -708,20 +708,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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<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/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/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html
index 85416fa..ec743ba 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html
@@ -367,7 +367,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher">ScanQueryMatcher.MatchCode</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html#line.57">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher">ScanQueryMatcher.MatchCode</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html#line.90">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -387,7 +387,7 @@ for (ScanQueryMatcher.MatchCode c : ScanQueryMatcher.MatchCode.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html#line.57">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;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html#line.90">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;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 


[24/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
index 242189f..05eaf18 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
@@ -102,499 +102,500 @@
 <span class="sourceLineNo">094</span>    this.hasMVCCInfo = hasMVCC;<a name="line.94"></a>
 <span class="sourceLineNo">095</span>    this.scannerOrder = scannerOrder;<a name="line.95"></a>
 <span class="sourceLineNo">096</span>    this.canOptimizeForNonNullColumn = canOptimizeForNonNullColumn;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  boolean isPrimaryReplica() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    return reader.isPrimaryReplicaReader();<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  /**<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * Return an array of scanners corresponding to the given set of store files.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   */<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  public static List&lt;StoreFileScanner&gt; getScannersForStoreFiles(Collection&lt;HStoreFile&gt; files,<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      boolean cacheBlocks, boolean usePread, long readPt) throws IOException {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    return getScannersForStoreFiles(files, cacheBlocks, usePread, false, false, readPt);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  /**<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * Return an array of scanners corresponding to the given set of store files.<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   */<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public static List&lt;StoreFileScanner&gt; getScannersForStoreFiles(Collection&lt;HStoreFile&gt; files,<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, boolean useDropBehind,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      long readPt) throws IOException {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    return getScannersForStoreFiles(files, cacheBlocks, usePread, isCompaction, useDropBehind, null,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      readPt);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  }<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>  /**<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * Return an array of scanners corresponding to the given set of store files, And set the<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * ScanQueryMatcher for each store file scanner for further optimization<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static List&lt;StoreFileScanner&gt; getScannersForStoreFiles(Collection&lt;HStoreFile&gt; files,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, boolean canUseDrop,<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      ScanQueryMatcher matcher, long readPt) throws IOException {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    if (files.isEmpty()) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      return Collections.emptyList();<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    List&lt;StoreFileScanner&gt; scanners = new ArrayList&lt;&gt;(files.size());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    boolean canOptimizeForNonNullColumn = matcher != null ? !matcher.hasNullColumnInQuery() : false;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    PriorityQueue&lt;HStoreFile&gt; sortedFiles =<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        new PriorityQueue&lt;&gt;(files.size(), StoreFileComparators.SEQ_ID);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    for (HStoreFile file : files) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      // The sort function needs metadata so we need to open reader first before sorting the list.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      file.initReader();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      sortedFiles.add(file);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    boolean succ = false;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    try {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      for (int i = 0, n = files.size(); i &lt; n; i++) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        HStoreFile sf = sortedFiles.remove();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        StoreFileScanner scanner;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        if (usePread) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          scanner = sf.getPreadScanner(cacheBlocks, readPt, i, canOptimizeForNonNullColumn);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        } else {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          scanner = sf.getStreamScanner(canUseDrop, cacheBlocks, isCompaction, readPt, i,<a name="line.148"></a>
-<span class="sourceLineNo">149</span>              canOptimizeForNonNullColumn);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        scanners.add(scanner);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      succ = true;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    } finally {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      if (!succ) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        for (StoreFileScanner scanner : scanners) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          scanner.close();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return scanners;<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>  /**<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Get scanners for compaction. We will create a separated reader for each store file to avoid<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * contention with normal read request.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   */<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public static List&lt;StoreFileScanner&gt; getScannersForCompaction(Collection&lt;HStoreFile&gt; files,<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      boolean canUseDropBehind, long readPt) throws IOException {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    List&lt;StoreFileScanner&gt; scanners = new ArrayList&lt;&gt;(files.size());<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    List&lt;HStoreFile&gt; sortedFiles = new ArrayList&lt;&gt;(files);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    Collections.sort(sortedFiles, StoreFileComparators.SEQ_ID);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    boolean succ = false;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    try {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      for (int i = 0, n = sortedFiles.size(); i &lt; n; i++) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        scanners.add(<a name="line.176"></a>
-<span class="sourceLineNo">177</span>          sortedFiles.get(i).getStreamScanner(canUseDropBehind, false, true, readPt, i, false));<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      succ = true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } finally {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      if (!succ) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        for (StoreFileScanner scanner : scanners) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          scanner.close();<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>    }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    return scanners;<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>  @Override<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public String toString() {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    return "StoreFileScanner[" + hfs.toString() + ", cur=" + cur + "]";<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public Cell peek() {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return cur;<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 Cell next() throws IOException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    Cell retKey = cur;<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>    try {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      // only seek if we aren't at the end. cur == null implies 'end'.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (cur != null) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        hfs.next();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        setCurrentCell(hfs.getCell());<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        if (hasMVCCInfo || this.reader.isBulkLoaded()) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          skipKVsNewerThanReadpoint();<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>    } catch (FileNotFoundException e) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      throw e;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    } catch(IOException e) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      throw new IOException("Could not iterate " + this, e);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    return retKey;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  public boolean seek(Cell key) throws IOException {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    if (seekCount != null) seekCount.increment();<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    try {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        if(!seekAtOrAfter(hfs, key)) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          this.cur = null;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          return false;<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>        setCurrentCell(hfs.getCell());<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (!hasMVCCInfo &amp;&amp; this.reader.isBulkLoaded()) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          return skipKVsNewerThanReadpoint();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        } else {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          return !hasMVCCInfo ? true : skipKVsNewerThanReadpoint();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      } finally {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        realSeekDone = true;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    } catch (FileNotFoundException e) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      throw e;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } catch (IOException ioe) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      throw new IOException("Could not seek " + this + " to key " + key, ioe);<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>  @Override<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public boolean reseek(Cell key) throws IOException {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    if (seekCount != null) seekCount.increment();<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    try {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      try {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        if (!reseekAtOrAfter(hfs, key)) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          this.cur = null;<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>        setCurrentCell(hfs.getCell());<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>        if (!hasMVCCInfo &amp;&amp; this.reader.isBulkLoaded()) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          return skipKVsNewerThanReadpoint();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } else {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          return !hasMVCCInfo ? true : skipKVsNewerThanReadpoint();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      } finally {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        realSeekDone = true;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    } catch (FileNotFoundException e) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      throw e;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    } catch (IOException ioe) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      throw new IOException("Could not reseek " + this + " to key " + key,<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          ioe);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  protected void setCurrentCell(Cell newVal) throws IOException {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    this.cur = newVal;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (this.cur != null &amp;&amp; this.reader.isBulkLoaded() &amp;&amp; !this.reader.isSkipResetSeqId()) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      PrivateCellUtil.setSequenceId(cur, this.reader.getSequenceID());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  }<a name="line.282"></a>
-<span class="sourceLineNo">283</span><a name="line.283"></a>
-<span class="sourceLineNo">284</span>  protected boolean skipKVsNewerThanReadpoint() throws IOException {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // We want to ignore all key-values that are newer than our current<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    // readPoint<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Cell startKV = cur;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    while(enforceMVCC<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        &amp;&amp; cur != null<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        &amp;&amp; (cur.getSequenceId() &gt; readPt)) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      boolean hasNext = hfs.next();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      setCurrentCell(hfs.getCell());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (hasNext &amp;&amp; this.stopSkippingKVsIfNextRow<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          &amp;&amp; getComparator().compareRows(cur, startKV) &gt; 0) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        return false;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<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>    if (cur == null) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      return false;<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>    return true;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  @Override<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  public void close() {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    if (closed) return;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    cur = null;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.hfs.close();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    if (this.reader != null) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      this.reader.readCompleted();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    closed = true;<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>  /**<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   *<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * @param s<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * @param k<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * @return false if not found or if k is after the end.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * @throws IOException<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  public static boolean seekAtOrAfter(HFileScanner s, Cell k)<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    int result = s.seekTo(k);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    if(result &lt; 0) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      if (result == HConstants.INDEX_KEY_MAGIC) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        // using faked key<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        return true;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Passed KV is smaller than first KV in file, work from start of file<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return s.seekTo();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } else if(result &gt; 0) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      // Passed KV is larger than current KV in file, if there is a next<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      // it is the "after", if not then this scanner is done.<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      return s.next();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Seeked to the exact key<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    return true;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  static boolean reseekAtOrAfter(HFileScanner s, Cell k)<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  throws IOException {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    //This function is similar to seekAtOrAfter function<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    int result = s.reseekTo(k);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    if (result &lt;= 0) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      if (result == HConstants.INDEX_KEY_MAGIC) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        // using faked key<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        return true;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      // If up to now scanner is not seeked yet, this means passed KV is smaller<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      // than first KV in file, and it is the first time we seek on this file.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      // So we also need to work from the start of file.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      if (!s.isSeeked()) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        return  s.seekTo();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      return true;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // passed KV is larger than current KV in file, if there is a next<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    // it is after, if not then this scanner is done.<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    return s.next();<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>   * @see KeyValueScanner#getScannerOrder()<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  @Override<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  public long getScannerOrder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return scannerOrder;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * Pretend we have done a seek but don't do it yet, if possible. The hope is<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * that we find requested columns in more recent files and won't have to seek<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * in older files. Creates a fake key/value with the given row/column and the<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * highest (most recent) possible timestamp we might get from this file. When<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * users of such "lazy scanner" need to know the next KV precisely (e.g. when<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * this scanner is at the top of the heap), they run {@link #enforceSeek()}.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * &lt;p&gt;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Note that this function does guarantee that the current KV of this scanner<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * will be advanced to at least the given KV. Because of this, it does have<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * to do a real seek in cases when the seek timestamp is older than the<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * highest timestamp of the file, e.g. when we are trying to seek to the next<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   * row/column and use OLDEST_TIMESTAMP in the seek key.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   */<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  @Override<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  public boolean requestSeek(Cell kv, boolean forward, boolean useBloom)<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (kv.getFamilyLength() == 0) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      useBloom = false;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>    boolean haveToSeek = true;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (useBloom) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      // check ROWCOL Bloom filter first.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      if (reader.getBloomFilterType() == BloomType.ROWCOL) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        haveToSeek = reader.passesGeneralRowColBloomFilter(kv);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      } else if (canOptimizeForNonNullColumn<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          &amp;&amp; ((PrivateCellUtil.isDeleteFamily(kv)<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              || PrivateCellUtil.isDeleteFamilyVersion(kv)))) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        // if there is no such delete family kv in the store file,<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        // then no need to seek.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        haveToSeek = reader.passesDeleteFamilyBloomFilter(kv.getRowArray(), kv.getRowOffset(),<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          kv.getRowLength());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>    delayedReseek = forward;<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    delayedSeekKV = kv;<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    if (haveToSeek) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      // This row/column might be in this store file (or we did not use the<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      // Bloom filter), so we still need to seek.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      realSeekDone = false;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      long maxTimestampInFile = reader.getMaxTimestamp();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      long seekTimestamp = kv.getTimestamp();<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (seekTimestamp &gt; maxTimestampInFile) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // Create a fake key that is not greater than the real next key.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        // (Lower timestamps correspond to higher KVs.)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        // To understand this better, consider that we are asked to seek to<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        // a higher timestamp than the max timestamp in this file. We know that<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        // the next point when we have to consider this file again is when we<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // pass the max timestamp of this file (with the same row/column).<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        setCurrentCell(PrivateCellUtil.createFirstOnRowColTS(kv, maxTimestampInFile));<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      } else {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        // This will be the case e.g. when we need to seek to the next<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        // row/column, and we don't know exactly what they are, so we set the<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        // seek key's timestamp to OLDEST_TIMESTAMP to skip the rest of this<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // row/column.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        enforceSeek();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      return cur != null;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>    // Multi-column Bloom filter optimization.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // Create a fake key/value, so that this scanner only bubbles up to the top<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    // of the KeyValueHeap in StoreScanner after we scanned this row/column in<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    // all other store files. The query matcher will then just skip this fake<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    // key/value and the store scanner will progress to the next column. This<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // is obviously not a "real real" seek, but unlike the fake KV earlier in<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    // this method, we want this to be propagated to ScanQueryMatcher.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    setCurrentCell(PrivateCellUtil.createLastOnRowCol(kv));<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>    realSeekDone = true;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return true;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  StoreFileReader getReader() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return reader;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  CellComparator getComparator() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return reader.getComparator();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public boolean realSeekDone() {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    return realSeekDone;<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>
-<span class="sourceLineNo">462</span>  @Override<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  public void enforceSeek() throws IOException {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    if (realSeekDone)<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      return;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (delayedReseek) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      reseek(delayedSeekKV);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    } else {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      seek(delayedSeekKV);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public boolean isFileScanner() {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    return true;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>  @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  public Path getFilePath() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    return reader.getHFileReader().getPath();<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>  // Test methods<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  static final long getSeekCount() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return seekCount.sum();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  static final void instrument() {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    seekCount = new LongAdder();<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>  @Override<a name="line.493"></a>
-<span class="sourceLineNo">494</span>  public boolean shouldUseScanner(Scan scan, HStore store, long oldestUnexpiredTS) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    // if the file has no entries, no need to validate or create a scanner.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    byte[] cf = store.getColumnFamilyDescriptor().getName();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    TimeRange timeRange = scan.getColumnFamilyTimeRange().get(cf);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    if (timeRange == null) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      timeRange = scan.getTimeRange();<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    return reader.passesTimerangeFilter(timeRange, oldestUnexpiredTS) &amp;&amp; reader<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        .passesKeyRangeFilter(scan) &amp;&amp; reader.passesBloomFilter(scan, scan.getFamilyMap().get(cf));<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>  @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  public boolean seekToPreviousRow(Cell originalKey) throws IOException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    try {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        boolean keepSeeking = false;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        Cell key = originalKey;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        do {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          Cell seekKey = PrivateCellUtil.createFirstOnRow(key);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          if (seekCount != null) seekCount.increment();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          if (!hfs.seekBefore(seekKey)) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>            this.cur = null;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            return false;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Cell curCell = hfs.getCell();<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          Cell firstKeyOfPreviousRow = PrivateCellUtil.createFirstOnRow(curCell);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>          if (seekCount != null) seekCount.increment();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          if (!seekAtOrAfter(hfs, firstKeyOfPreviousRow)) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>            this.cur = null;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>            return false;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          setCurrentCell(hfs.getCell());<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          this.stopSkippingKVsIfNextRow = true;<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          boolean resultOfSkipKVs;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          try {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>            resultOfSkipKVs = skipKVsNewerThanReadpoint();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          } finally {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>            this.stopSkippingKVsIfNextRow = false;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          if (!resultOfSkipKVs<a name="line.535"></a>
-<span class="sourceLineNo">536</span>              || getComparator().compareRows(cur, firstKeyOfPreviousRow) &gt; 0) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>            keepSeeking = true;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>            key = firstKeyOfPreviousRow;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            continue;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          } else {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>            keepSeeking = false;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        } while (keepSeeking);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return true;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      } finally {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        realSeekDone = true;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    } catch (FileNotFoundException e) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      throw e;<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    } catch (IOException ioe) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      throw new IOException("Could not seekToPreviousRow " + this + " to key "<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          + originalKey, ioe);<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>  @Override<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  public boolean seekToLastRow() throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    Optional&lt;byte[]&gt; lastRow = reader.getLastRowKey();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    if (!lastRow.isPresent()) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      return false;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    Cell seekKey = PrivateCellUtil.createFirstOnRow(lastRow.get());<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (seek(seekKey)) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      return true;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    } else {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      return seekToPreviousRow(seekKey);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<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>  @Override<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  public boolean backwardSeek(Cell key) throws IOException {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    seek(key);<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    if (cur == null<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        || getComparator().compareRows(cur, key) &gt; 0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      return seekToPreviousRow(key);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    return true;<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>  @Override<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  public Cell getNextIndexedKey() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    return hfs.getNextIndexedKey();<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>  @Override<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public void shipped() throws IOException {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    this.hfs.shipped();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>}<a name="line.589"></a>
+<span class="sourceLineNo">097</span>    this.reader.incrementRefCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  }<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  boolean isPrimaryReplica() {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    return reader.isPrimaryReplicaReader();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  /**<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * Return an array of scanners corresponding to the given set of store files.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   */<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public static List&lt;StoreFileScanner&gt; getScannersForStoreFiles(Collection&lt;HStoreFile&gt; files,<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      boolean cacheBlocks, boolean usePread, long readPt) throws IOException {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    return getScannersForStoreFiles(files, cacheBlocks, usePread, false, false, readPt);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  /**<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * Return an array of scanners corresponding to the given set of store files.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   */<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static List&lt;StoreFileScanner&gt; getScannersForStoreFiles(Collection&lt;HStoreFile&gt; files,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, boolean useDropBehind,<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      long readPt) throws IOException {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return getScannersForStoreFiles(files, cacheBlocks, usePread, isCompaction, useDropBehind, null,<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      readPt);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
+<span class="sourceLineNo">121</span><a name="line.121"></a>
+<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * Return an array of scanners corresponding to the given set of store files, And set the<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * ScanQueryMatcher for each store file scanner for further optimization<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static List&lt;StoreFileScanner&gt; getScannersForStoreFiles(Collection&lt;HStoreFile&gt; files,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, boolean canUseDrop,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      ScanQueryMatcher matcher, long readPt) throws IOException {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (files.isEmpty()) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      return Collections.emptyList();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    List&lt;StoreFileScanner&gt; scanners = new ArrayList&lt;&gt;(files.size());<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    boolean canOptimizeForNonNullColumn = matcher != null ? !matcher.hasNullColumnInQuery() : false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    PriorityQueue&lt;HStoreFile&gt; sortedFiles =<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        new PriorityQueue&lt;&gt;(files.size(), StoreFileComparators.SEQ_ID);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    for (HStoreFile file : files) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      // The sort function needs metadata so we need to open reader first before sorting the list.<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      file.initReader();<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      sortedFiles.add(file);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    boolean succ = false;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    try {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      for (int i = 0, n = files.size(); i &lt; n; i++) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        HStoreFile sf = sortedFiles.remove();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        StoreFileScanner scanner;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        if (usePread) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          scanner = sf.getPreadScanner(cacheBlocks, readPt, i, canOptimizeForNonNullColumn);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        } else {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          scanner = sf.getStreamScanner(canUseDrop, cacheBlocks, isCompaction, readPt, i,<a name="line.149"></a>
+<span class="sourceLineNo">150</span>              canOptimizeForNonNullColumn);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        scanners.add(scanner);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      succ = true;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    } finally {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (!succ) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        for (StoreFileScanner scanner : scanners) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>          scanner.close();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        }<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>    return scanners;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<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>   * Get scanners for compaction. We will create a separated reader for each store file to avoid<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * contention with normal read request.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public static List&lt;StoreFileScanner&gt; getScannersForCompaction(Collection&lt;HStoreFile&gt; files,<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      boolean canUseDropBehind, long readPt) throws IOException {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    List&lt;StoreFileScanner&gt; scanners = new ArrayList&lt;&gt;(files.size());<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    List&lt;HStoreFile&gt; sortedFiles = new ArrayList&lt;&gt;(files);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    Collections.sort(sortedFiles, StoreFileComparators.SEQ_ID);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    boolean succ = false;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    try {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      for (int i = 0, n = sortedFiles.size(); i &lt; n; i++) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        scanners.add(<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          sortedFiles.get(i).getStreamScanner(canUseDropBehind, false, true, readPt, i, false));<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      succ = true;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    } finally {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      if (!succ) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        for (StoreFileScanner scanner : scanners) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          scanner.close();<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>    }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    return scanners;<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>  @Override<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  public String toString() {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    return "StoreFileScanner[" + hfs.toString() + ", cur=" + cur + "]";<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>  @Override<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public Cell peek() {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    return cur;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  @Override<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  public Cell next() throws IOException {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    Cell retKey = cur;<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>    try {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // only seek if we aren't at the end. cur == null implies 'end'.<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      if (cur != null) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        hfs.next();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        setCurrentCell(hfs.getCell());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        if (hasMVCCInfo || this.reader.isBulkLoaded()) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          skipKVsNewerThanReadpoint();<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>    } catch (FileNotFoundException e) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      throw e;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    } catch(IOException e) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      throw new IOException("Could not iterate " + this, e);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    return retKey;<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 seek(Cell key) throws IOException {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    if (seekCount != null) seekCount.increment();<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      try {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if(!seekAtOrAfter(hfs, key)) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          this.cur = null;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          return false;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span>        setCurrentCell(hfs.getCell());<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>        if (!hasMVCCInfo &amp;&amp; this.reader.isBulkLoaded()) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>          return skipKVsNewerThanReadpoint();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        } else {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          return !hasMVCCInfo ? true : skipKVsNewerThanReadpoint();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      } finally {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        realSeekDone = true;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    } catch (FileNotFoundException e) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      throw e;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    } catch (IOException ioe) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      throw new IOException("Could not seek " + this + " to key " + key, ioe);<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><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  @Override<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public boolean reseek(Cell key) throws IOException {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    if (seekCount != null) seekCount.increment();<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>    try {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      try {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        if (!reseekAtOrAfter(hfs, key)) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          this.cur = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          return false;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        }<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        setCurrentCell(hfs.getCell());<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        if (!hasMVCCInfo &amp;&amp; this.reader.isBulkLoaded()) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          return skipKVsNewerThanReadpoint();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        } else {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          return !hasMVCCInfo ? true : skipKVsNewerThanReadpoint();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      } finally {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        realSeekDone = true;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    } catch (FileNotFoundException e) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      throw e;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    } catch (IOException ioe) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      throw new IOException("Could not reseek " + this + " to key " + key,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          ioe);<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><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setCurrentCell(Cell newVal) throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.cur = newVal;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    if (this.cur != null &amp;&amp; this.reader.isBulkLoaded() &amp;&amp; !this.reader.isSkipResetSeqId()) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      PrivateCellUtil.setSequenceId(cur, this.reader.getSequenceID());<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<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>  protected boolean skipKVsNewerThanReadpoint() throws IOException {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    // We want to ignore all key-values that are newer than our current<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    // readPoint<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    Cell startKV = cur;<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    while(enforceMVCC<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        &amp;&amp; cur != null<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        &amp;&amp; (cur.getSequenceId() &gt; readPt)) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      boolean hasNext = hfs.next();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      setCurrentCell(hfs.getCell());<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      if (hasNext &amp;&amp; this.stopSkippingKVsIfNextRow<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          &amp;&amp; getComparator().compareRows(cur, startKV) &gt; 0) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        return false;<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>    if (cur == null) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      return false;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>    return true;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>  @Override<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  public void close() {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (closed) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    cur = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    this.hfs.close();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    if (this.reader != null) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      this.reader.readCompleted();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    closed = true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   *<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * @param s<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * @param k<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * @return false if not found or if k is after the end.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * @throws IOException<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public static boolean seekAtOrAfter(HFileScanner s, Cell k)<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    int result = s.seekTo(k);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    if(result &lt; 0) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (result == HConstants.INDEX_KEY_MAGIC) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        // using faked key<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        return true;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      // Passed KV is smaller than first KV in file, work from start of file<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      return s.seekTo();<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    } else if(result &gt; 0) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      // Passed KV is larger than current KV in file, if there is a next<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      // it is the "after", if not then this scanner is done.<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      return s.next();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    // Seeked to the exact key<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return true;<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>  static boolean reseekAtOrAfter(HFileScanner s, Cell k)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  throws IOException {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    //This function is similar to seekAtOrAfter function<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    int result = s.reseekTo(k);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (result &lt;= 0) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      if (result == HConstants.INDEX_KEY_MAGIC) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        // using faked key<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return true;<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      // If up to now scanner is not seeked yet, this means passed KV is smaller<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      // than first KV in file, and it is the first time we seek on this file.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      // So we also need to work from the start of file.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (!s.isSeeked()) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        return  s.seekTo();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      return true;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    // passed KV is larger than current KV in file, if there is a next<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // it is after, if not then this scanner is done.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    return s.next();<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>   * @see KeyValueScanner#getScannerOrder()<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public long getScannerOrder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return scannerOrder;<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>   * Pretend we have done a seek but don't do it yet, if possible. The hope is<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * that we find requested columns in more recent files and won't have to seek<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * in older files. Creates a fake key/value with the given row/column and the<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * highest (most recent) possible timestamp we might get from this file. When<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * users of such "lazy scanner" need to know the next KV precisely (e.g. when<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * this scanner is at the top of the heap), they run {@link #enforceSeek()}.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * &lt;p&gt;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * Note that this function does guarantee that the current KV of this scanner<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * will be advanced to at least the given KV. Because of this, it does have<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * to do a real seek in cases when the seek timestamp is older than the<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * highest timestamp of the file, e.g. when we are trying to seek to the next<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * row/column and use OLDEST_TIMESTAMP in the seek key.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  @Override<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  public boolean requestSeek(Cell kv, boolean forward, boolean useBloom)<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (kv.getFamilyLength() == 0) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      useBloom = false;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
+<span class="sourceLineNo">394</span><a name="line.394"></a>
+<span class="sourceLineNo">395</span>    boolean haveToSeek = true;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    if (useBloom) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      // check ROWCOL Bloom filter first.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      if (reader.getBloomFilterType() == BloomType.ROWCOL) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        haveToSeek = reader.passesGeneralRowColBloomFilter(kv);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      } else if (canOptimizeForNonNullColumn<a name="line.400"></a>
+<span class="sourceLineNo">401</span>          &amp;&amp; ((PrivateCellUtil.isDeleteFamily(kv)<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              || PrivateCellUtil.isDeleteFamilyVersion(kv)))) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        // if there is no such delete family kv in the store file,<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // then no need to seek.<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        haveToSeek = reader.passesDeleteFamilyBloomFilter(kv.getRowArray(), kv.getRowOffset(),<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          kv.getRowLength());<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>    delayedReseek = forward;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    delayedSeekKV = kv;<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>    if (haveToSeek) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      // This row/column might be in this store file (or we did not use the<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      // Bloom filter), so we still need to seek.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      realSeekDone = false;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      long maxTimestampInFile = reader.getMaxTimestamp();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      long seekTimestamp = kv.getTimestamp();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      if (seekTimestamp &gt; maxTimestampInFile) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Create a fake key that is not greater than the real next key.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // (Lower timestamps correspond to higher KVs.)<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // To understand this better, consider that we are asked to seek to<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        // a higher timestamp than the max timestamp in this file. We know that<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        // the next point when we have to consider this file again is when we<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        // pass the max timestamp of this file (with the same row/column).<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        setCurrentCell(PrivateCellUtil.createFirstOnRowColTS(kv, maxTimestampInFile));<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      } else {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        // This will be the case e.g. when we need to seek to the next<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        // row/column, and we don't know exactly what they are, so we set the<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        // seek key's timestamp to OLDEST_TIMESTAMP to skip the rest of this<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        // row/column.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        enforceSeek();<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      return cur != null;<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    }<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // Multi-column Bloom filter optimization.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    // Create a fake key/value, so that this scanner only bubbles up to the top<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    // of the KeyValueHeap in StoreScanner after we scanned this row/column in<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    // all other store files. The query matcher will then just skip this fake<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    // key/value and the store scanner will progress to the next column. This<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    // is obviously not a "real real" seek, but unlike the fake KV earlier in<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    // this method, we want this to be propagated to ScanQueryMatcher.<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    setCurrentCell(PrivateCellUtil.createLastOnRowCol(kv));<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    realSeekDone = true;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return true;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>  StoreFileReader getReader() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return reader;<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>  CellComparator getComparator() {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    return reader.getComparator();<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Override<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public boolean realSeekDone() {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return realSeekDone;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  @Override<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public void enforceSeek() throws IOException {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    if (realSeekDone)<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      return;<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>    if (delayedReseek) {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      reseek(delayedSeekKV);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    } else {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      seek(delayedSeekKV);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Override<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public boolean isFileScanner() {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    return true;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>  public Path getFilePath() {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    return reader.getHFileReader().getPath();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>  // Test methods<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  static final long getSeekCount() {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    return seekCount.sum();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>  }<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>  static final void instrument() {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    seekCount = new LongAdder();<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>  @Override<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  public boolean shouldUseScanner(Scan scan, HStore store, long oldestUnexpiredTS) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    // if the file has no entries, no need to validate or create a scanner.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    byte[] cf = store.getColumnFamilyDescriptor().getName();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    TimeRange timeRange = scan.getColumnFamilyTimeRange().get(cf);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    if (timeRange == null) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      timeRange = scan.getTimeRange();<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return reader.passesTimerangeFilter(timeRange, oldestUnexpiredTS) &amp;&amp; reader<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        .passesKeyRangeFilter(scan) &amp;&amp; reader.passesBloomFilter(scan, scan.getFamilyMap().get(cf));<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
+<span class="sourceLineNo">505</span><a name="line.505"></a>
+<span class="sourceLineNo">506</span>  @Override<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  public boolean seekToPreviousRow(Cell originalKey) throws IOException {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      try {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        boolean keepSeeking = false;<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        Cell key = originalKey;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        do {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          Cell seekKey = PrivateCellUtil.createFirstOnRow(key);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          if (seekCount != null) seekCount.increment();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          if (!hfs.seekBefore(seekKey)) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>            this.cur = null;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            return false;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          }<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Cell curCell = hfs.getCell();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          Cell firstKeyOfPreviousRow = PrivateCellUtil.createFirstOnRow(curCell);<a name="line.520"></a>
+<span class="sourceLineNo">521</span><a name="line.521"></a>
+<span class="sourceLineNo">522</span>          if (seekCount != null) seekCount.increment();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          if (!seekAtOrAfter(hfs, firstKeyOfPreviousRow)) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>            this.cur = null;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>            return false;<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>          setCurrentCell(hfs.getCell());<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          this.stopSkippingKVsIfNextRow = true;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          boolean resultOfSkipKVs;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          try {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>            resultOfSkipKVs = skipKVsNewerThanReadpoint();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          } finally {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>            this.stopSkippingKVsIfNextRow = false;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          if (!resultOfSkipKVs<a name="line.536"></a>
+<span class="sourceLineNo">537</span>              || getComparator().compareRows(cur, firstKeyOfPreviousRow) &gt; 0) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            keepSeeking = true;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>            key = firstKeyOfPreviousRow;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>            continue;<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          } else {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>            keepSeeking = false;<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          }<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        } while (keepSeeking);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return true;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        realSeekDone = true;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    } catch (FileNotFoundException e) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      throw e;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    } catch (IOException ioe) {<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      throw new IOException("Could not seekToPreviousRow " + this + " to key "<a name="line.552"></a>
+<span class="sourceLineNo">553</span>          + originalKey, ioe);<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="sourceL

<TRUNCATED>

[37/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
index 959aee4..b88f63d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -1749,7 +1749,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2406">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2416">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -1758,7 +1758,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2410">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2420">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 </li>
@@ -3017,7 +3017,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionProgress</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionProgress.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionProgress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1711">getCompactionProgress</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionProgress.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionProgress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1721">getCompactionProgress</a>()</pre>
 <div class="block">getter for CompactionProgress object</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -3031,7 +3031,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldPerformMajorCompaction</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1716">shouldPerformMajorCompaction</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1726">shouldPerformMajorCompaction</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 interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#shouldPerformMajorCompaction--">Store</a></code></span></div>
 <div class="block">Tests whether we should run a major compaction. For example, if the configured major compaction
@@ -3052,7 +3052,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>requestCompaction</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1728">requestCompaction</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1738">requestCompaction</a>()
                                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3066,7 +3066,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>requestCompaction</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1732">requestCompaction</a>(int&nbsp;priority,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1742">requestCompaction</a>(int&nbsp;priority,
                                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">CompactionLifeCycleTracker</a>&nbsp;tracker,
                                                      <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
                                               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>
@@ -3082,7 +3082,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>addToCompactingFiles</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1814">addToCompactingFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesToAdd)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1824">addToCompactingFiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesToAdd)</pre>
 <div class="block">Adds the files to compacting files. filesCompacting must be locked.</div>
 </li>
 </ul>
@@ -3092,7 +3092,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>removeUnneededFiles</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1826">removeUnneededFiles</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1836">removeUnneededFiles</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3106,7 +3106,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>cancelRequestedCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1862">cancelRequestedCompaction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&nbsp;compaction)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1872">cancelRequestedCompaction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&nbsp;compaction)</pre>
 </li>
 </ul>
 <a name="finishCompactionRequest-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl-">
@@ -3115,7 +3115,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>finishCompactionRequest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1866">finishCompactionRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1876">finishCompactionRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr)</pre>
 </li>
 </ul>
 <a name="validateStoreFile-org.apache.hadoop.fs.Path-">
@@ -3124,7 +3124,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>validateStoreFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1882">validateStoreFile</a>(org.apache.hadoop.fs.Path&nbsp;path)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1892">validateStoreFile</a>(org.apache.hadoop.fs.Path&nbsp;path)
                         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">Validates a store file by opening and closing it. In HFileV2 this should not be an expensive
  operation.</div>
@@ -3142,7 +3142,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>completeCompaction</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1911">completeCompaction</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedFiles)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1921">completeCompaction</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedFiles)
                            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"><p>It works by processing a compaction that's been written to disk.
 
@@ -3168,7 +3168,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>versionsToReturn</h4>
-<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1930">versionsToReturn</a>(int&nbsp;wantedVersions)</pre>
+<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1940">versionsToReturn</a>(int&nbsp;wantedVersions)</pre>
 </li>
 </ul>
 <a name="canSplit--">
@@ -3177,7 +3177,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>canSplit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1940">canSplit</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1950">canSplit</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#canSplit--">Store</a></code></span></div>
 <div class="block">Returns whether this store is splittable, i.e., no reference file in this store.</div>
 <dl>
@@ -3192,7 +3192,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getSplitPoint</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1957">getSplitPoint</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1967">getSplitPoint</a>()</pre>
 <div class="block">Determines if Store should be split.</div>
 </li>
 </ul>
@@ -3202,7 +3202,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastCompactSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1977">getLastCompactSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1987">getLastCompactSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getLastCompactSize--">getLastCompactSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3217,7 +3217,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1982">getSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1992">getSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getSize--">getSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3232,7 +3232,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>triggerMajorCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1986">triggerMajorCompaction</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1996">triggerMajorCompaction</a>()</pre>
 </li>
 </ul>
 <a name="getScanner-org.apache.hadoop.hbase.client.Scan-java.util.NavigableSet-long-">
@@ -3241,7 +3241,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanner</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2002">getScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2012">getScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&nbsp;targetCols,
                                   long&nbsp;readPt)
                            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>
@@ -3264,7 +3264,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createScanner</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2019">createScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2029">createScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&nbsp;targetCols,
                                         long&nbsp;readPt)
@@ -3281,7 +3281,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>recreateScanners</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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2041">recreateScanners</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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;currentFileScanners,
+<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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2051">recreateScanners</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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;currentFileScanners,
                                               boolean&nbsp;cacheBlocks,
                                               boolean&nbsp;usePread,
                                               boolean&nbsp;isCompaction,
@@ -3320,7 +3320,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <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/regionserver/HStore.html#line.2075">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/regionserver/HStore.html#line.2085">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>
@@ -3333,7 +3333,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStorefilesCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2080">getStorefilesCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2090">getStorefilesCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getStorefilesCount--">getStorefilesCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3348,7 +3348,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactedFilesCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2085">getCompactedFilesCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2095">getCompactedFilesCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCompactedFilesCount--">getCompactedFilesCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3363,7 +3363,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileAgeStream</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/LongStream.html?is-external=true" title="class or interface in java.util.stream">LongStream</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2089">getStoreFileAgeStream</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/LongStream.html?is-external=true" title="class or interface in java.util.stream">LongStream</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2099">getStoreFileAgeStream</a>()</pre>
 </li>
 </ul>
 <a name="getMaxStoreFileAge--">
@@ -3372,7 +3372,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxStoreFileAge</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2102">getMaxStoreFileAge</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2112">getMaxStoreFileAge</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMaxStoreFileAge--">getMaxStoreFileAge</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3387,7 +3387,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMinStoreFileAge</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2107">getMinStoreFileAge</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2117">getMinStoreFileAge</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMinStoreFileAge--">getMinStoreFileAge</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3402,7 +3402,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getAvgStoreFileAge</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalDouble.html?is-external=true" title="class or interface in java.util">OptionalDouble</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2112">getAvgStoreFileAge</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalDouble.html?is-external=true" title="class or interface in java.util">OptionalDouble</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2122">getAvgStoreFileAge</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getAvgStoreFileAge--">getAvgStoreFileAge</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3417,7 +3417,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumReferenceFiles</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2117">getNumReferenceFiles</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2127">getNumReferenceFiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getNumReferenceFiles--">getNumReferenceFiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3432,7 +3432,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumHFiles</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2123">getNumHFiles</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2133">getNumHFiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getNumHFiles--">getNumHFiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3447,7 +3447,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreSizeUncompressed</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2129">getStoreSizeUncompressed</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2139">getStoreSizeUncompressed</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getStoreSizeUncompressed--">getStoreSizeUncompressed</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3462,7 +3462,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStorefilesSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2134">getStorefilesSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2144">getStorefilesSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getStorefilesSize--">getStorefilesSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3477,7 +3477,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFilesSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2140">getHFilesSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2150">getHFilesSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getHFilesSize--">getHFilesSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3492,7 +3492,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStorefilesSize</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2145">getStorefilesSize</a>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2155">getStorefilesSize</a>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</pre>
 </li>
 </ul>
 <a name="getStoreFileFieldSize-java.util.function.ToLongFunction-">
@@ -3501,7 +3501,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileFieldSize</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2156">getStoreFileFieldSize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/ToLongFunction.html?is-external=true" title="class or interface in java.util.function">ToLongFunction</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a>&gt;&nbsp;f)</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2166">getStoreFileFieldSize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/ToLongFunction.html?is-external=true" title="class or interface in java.util.function">ToLongFunction</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a>&gt;&nbsp;f)</pre>
 </li>
 </ul>
 <a name="getStorefilesRootLevelIndexSize--">
@@ -3510,7 +3510,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStorefilesRootLevelIndexSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2168">getStorefilesRootLevelIndexSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2178">getStorefilesRootLevelIndexSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getStorefilesRootLevelIndexSize--">getStorefilesRootLevelIndexSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3525,7 +3525,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalStaticIndexSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2173">getTotalStaticIndexSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2183">getTotalStaticIndexSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getTotalStaticIndexSize--">Store</a></code></span></div>
 <div class="block">Returns the total size of all index blocks in the data block indexes, including the root level,
  intermediate levels, and the leaf level for multi-level indexes, or just the root level for
@@ -3544,7 +3544,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalStaticBloomSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2178">getTotalStaticBloomSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2188">getTotalStaticBloomSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getTotalStaticBloomSize--">Store</a></code></span></div>
 <div class="block">Returns the total byte size of all Bloom filter bit arrays. For compound Bloom filters even the
  Bloom blocks currently not loaded into the block cache are counted.</div>
@@ -3562,7 +3562,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2183">getMemStoreSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2193">getMemStoreSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMemStoreSize--">getMemStoreSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3577,7 +3577,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactPriority</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2188">getCompactPriority</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2198">getCompactPriority</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCompactPriority--">getCompactPriority</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3590,7 +3590,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>throttleCompaction</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2196">throttleCompaction</a>(long&nbsp;compactionSize)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2206">throttleCompaction</a>(long&nbsp;compactionSize)</pre>
 </li>
 </ul>
 <a name="getHRegion--">
@@ -3599,7 +3599,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getHRegion</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2200">getHRegion</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2210">getHRegion</a>()</pre>
 </li>
 </ul>
 <a name="getCoprocessorHost--">
@@ -3608,7 +3608,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoprocessorHost</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2204">getCoprocessorHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2214">getCoprocessorHost</a>()</pre>
 </li>
 </ul>
 <a name="getRegionInfo--">
@@ -3617,7 +3617,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <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/regionserver/HStore.html#line.2209">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/regionserver/HStore.html#line.2219">getRegionInfo</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getRegionInfo--">getRegionInfo</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3632,7 +3632,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>areWritesEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2214">areWritesEnabled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2224">areWritesEnabled</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#areWritesEnabled--">areWritesEnabled</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3645,7 +3645,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getSmallestReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2219">getSmallestReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2229">getSmallestReadPoint</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getSmallestReadPoint--">getSmallestReadPoint</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3662,7 +3662,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>upsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2234">upsert</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2244">upsert</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
                    long&nbsp;readpoint,
                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreSizing)
             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>
@@ -3687,7 +3687,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createFlushContext</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2244">createFlushContext</a>(long&nbsp;cacheFlushId,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2254">createFlushContext</a>(long&nbsp;cacheFlushId,
                                             <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
 </ul>
@@ -3697,7 +3697,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>needsCompaction</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2389">needsCompaction</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2399">needsCompaction</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#needsCompaction--">Store</a></code></span></div>
 <div class="block">See if there's too much store files in this store</div>
 <dl>
@@ -3715,7 +3715,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCacheConfig</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheConfig</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2402">getCacheConfig</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheConfig</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2412">getCacheConfig</a>()</pre>
 <div class="block">Used for tests.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -3729,7 +3729,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2417">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2427">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html#heapSize--">heapSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></code></dd>
@@ -3745,7 +3745,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getComparator</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2423">getComparator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2433">getComparator</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getComparator--">getComparator</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3758,7 +3758,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanInfo</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2427">getScanInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2437">getScanInfo</a>()</pre>
 </li>
 </ul>
 <a name="setScanInfo-org.apache.hadoop.hbase.regionserver.ScanInfo-">
@@ -3767,7 +3767,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setScanInfo</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2435">setScanInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2445">setScanInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo)</pre>
 <div class="block">Set scan info, used by test</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -3781,7 +3781,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>hasTooManyStoreFiles</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2440">hasTooManyStoreFiles</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2450">hasTooManyStoreFiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#hasTooManyStoreFiles--">hasTooManyStoreFiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3796,7 +3796,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushedCellsCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2445">getFlushedCellsCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2455">getFlushedCellsCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFlushedCellsCount--">getFlushedCellsCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3811,7 +3811,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushedCellsSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2450">getFlushedCellsSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2460">getFlushedCellsSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFlushedCellsSize--">getFlushedCellsSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3826,7 +3826,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushedOutputFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2455">getFlushedOutputFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2465">getFlushedOutputFileSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFlushedOutputFileSize--">getFlushedOutputFileSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3841,7 +3841,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactedCellsCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2460">getCompactedCellsCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2470">getCompactedCellsCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCompactedCellsCount--">getCompactedCellsCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3856,7 +3856,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactedCellsSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2465">getCompactedCellsSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2475">getCompactedCellsSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCompactedCellsSize--">getCompactedCellsSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3871,7 +3871,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMajorCompactedCellsCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2470">getMajorCompactedCellsCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2480">getMajorCompactedCellsCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMajorCompactedCellsCount--">getMajorCompactedCellsCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3886,7 +3886,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMajorCompactedCellsSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2475">getMajorCompactedCellsSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2485">getMajorCompactedCellsSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMajorCompactedCellsSize--">getMajorCompactedCellsSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3901,7 +3901,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreEngine</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2484">getStoreEngine</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2494">getStoreEngine</a>()</pre>
 <div class="block">Returns the StoreEngine that is backing this concrete implementation of Store.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -3915,7 +3915,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getOffPeakHours</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">OffPeakHours</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2488">getOffPeakHours</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">OffPeakHours</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2498">getOffPeakHours</a>()</pre>
 </li>
 </ul>
 <a name="onConfigurationChange-org.apache.hadoop.conf.Configuration-">
@@ -3924,7 +3924,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2496">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2506">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
 <dl>
@@ -3939,7 +3939,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>registerChildren</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2508">registerChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2518">registerChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
 <div class="block">Needs to be called to register the children to the manager.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -3955,7 +3955,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>deregisterChildren</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2516">deregisterChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2526">deregisterChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
 <div class="block">Needs to be called to deregister the children from the manager.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -3971,7 +3971,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionPressure</h4>
-<pre>public&nbsp;double&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2521">getCompactionPressure</a>()</pre>
+<pre>public&nbsp;double&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2531">getCompactionPressure</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCompactionPressure--">Store</a></code></span></div>
 <div class="block">This value can represent the degree of emergency of compaction for this store. It should be
  greater than or equal to 0.0, any value greater than 1.0 means we have too many store files.
@@ -3998,7 +3998,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>isPrimaryReplicaStore</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2526">isPrimaryReplicaStore</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2536">isPrimaryReplicaStore</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#isPrimaryReplicaStore--">isPrimaryReplicaStore</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -4011,7 +4011,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>preSnapshotOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2534">preSnapshotOperation</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2544">preSnapshotOperation</a>()</pre>
 <div class="block">Sets the store up for a region level snapshot operation.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -4025,7 +4025,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>postSnapshotOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2542">postSnapshotOperation</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2552">postSnapshotOperation</a>()</pre>
 <div class="block">Perform tasks needed after the completion of snapshot operation.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -4039,7 +4039,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>closeAndArchiveCompactedFiles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2549">closeAndArchiveCompactedFiles</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2559">closeAndArchiveCompactedFiles</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">Closes and archives the compacted files under this store</div>
 <dl>
@@ -4054,7 +4054,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>removeCompactedfiles</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2579">removeCompactedfiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedfiles)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2589">removeCompactedfiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedfiles)
                            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">Archives and removes the compacted files</div>
 <dl>
@@ -4071,7 +4071,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileSize</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2665">getStoreFileSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;file)</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2675">getStoreFileSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;file)</pre>
 <div class="block">Computes the length of a store file without succumbing to any errors along the way. If an
  error is encountered, the implementation returns <code>0</code> instead of the actual size.</div>
 <dl>
@@ -4088,7 +4088,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>preFlushSeqIDEstimation</h4>
-<pre>public&nbsp;<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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2683">preFlushSeqIDEstimation</a>()</pre>
+<pre>public&nbsp;<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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2693">preFlushSeqIDEstimation</a>()</pre>
 </li>
 </ul>
 <a name="isSloppyMemStore--">
@@ -4097,7 +4097,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>isSloppyMemStore</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2688">isSloppyMemStore</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2698">isSloppyMemStore</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#isSloppyMemStore--">isSloppyMemStore</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -4112,7 +4112,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>clearCompactedfiles</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2692">clearCompactedfiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesToRemove)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2702">clearCompactedfiles</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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesToRemove)
                           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>
@@ -4126,7 +4126,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>reportArchivedFilesForQuota</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2702">reportArchivedFilesForQuota</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;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFile.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFile</a>&gt;&nbsp;archivedFiles,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2712">reportArchivedFilesForQuota</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;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFile.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFile</a>&gt;&nbsp;archivedFiles,
                                  <a href="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/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;fileSizes)</pre>
 </li>
 </ul>
@@ -4136,7 +4136,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCurrentParallelPutCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2729">getCurrentParallelPutCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2739">getCurrentParallelPutCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCurrentParallelPutCount--">getCurrentParallelPutCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>


[20/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
index a1c9b1d..28973e0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
@@ -81,14 +81,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Object</span></a>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<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;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
+<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&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;)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
 </ul>
 </li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&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;)
+<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<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;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.procedure.ProcedureManager

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 8dfb8db..8d02b1f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -206,8 +206,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.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
index 7f2b04b..8307b08 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":9,"i7":9,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":9,"i7":9,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":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";
@@ -218,18 +218,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </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/quotas/TestMasterQuotasObserver.html#testNamespaceSpaceQuotaRemoved--">testNamespaceSpaceQuotaRemoved</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testNamespaceSpaceAndRPCQuotaRemoved--">testNamespaceSpaceAndRPCQuotaRemoved</a></span>()</code>&nbsp;</td>
 </tr>
 <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/quotas/TestMasterQuotasObserver.html#testObserverAddedByDefault--">testObserverAddedByDefault</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testNamespaceSpaceQuotaRemoved--">testNamespaceSpaceQuotaRemoved</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testTableRPCQuotaRemoved--">testTableRPCQuotaRemoved</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testObserverAddedByDefault--">testObserverAddedByDefault</a></span>()</code>&nbsp;</td>
 </tr>
 <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/quotas/TestMasterQuotasObserver.html#testTableRPCQuotaRemoved--">testTableRPCQuotaRemoved</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i13" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testTableSpaceAndRPCQuotaRemoved--">testTableSpaceAndRPCQuotaRemoved</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i14" class="altColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testTableSpaceQuotaRemoved--">testTableSpaceQuotaRemoved</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -385,13 +393,27 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testTableSpaceAndRPCQuotaRemoved--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testTableSpaceAndRPCQuotaRemoved</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.141">testTableSpaceAndRPCQuotaRemoved</a>()
+                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="testNamespaceSpaceQuotaRemoved--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testNamespaceSpaceQuotaRemoved</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.141">testNamespaceSpaceQuotaRemoved</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.173">testNamespaceSpaceQuotaRemoved</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -405,7 +427,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNamespaceRPCQuotaRemoved</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.167">testNamespaceRPCQuotaRemoved</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.199">testNamespaceRPCQuotaRemoved</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -413,13 +435,27 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testNamespaceSpaceAndRPCQuotaRemoved--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testNamespaceSpaceAndRPCQuotaRemoved</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.225">testNamespaceSpaceAndRPCQuotaRemoved</a>()
+                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="testObserverAddedByDefault--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testObserverAddedByDefault</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.193">testObserverAddedByDefault</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.260">testObserverAddedByDefault</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -433,7 +469,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>namespaceExists</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.202">namespaceExists</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;ns)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.269">namespaceExists</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;ns)
                         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>
@@ -447,7 +483,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumSpaceQuotas</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.212">getNumSpaceQuotas</a>()
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.279">getNumSpaceQuotas</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -461,7 +497,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getThrottleQuotas</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.223">getThrottleQuotas</a>()
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.290">getThrottleQuotas</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -475,7 +511,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.234">createTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.301">createTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                          org.apache.hadoop.hbase.TableName&nbsp;tn)
                   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>
@@ -490,7 +526,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>dropTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.241">dropTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#line.308">dropTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                        org.apache.hadoop.hbase.TableName&nbsp;tn)
                 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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
index 6ed1fbe..7de9cfe 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.212">TestEndToEndSplitTransaction.RegionChecker</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.292">TestEndToEndSplitTransaction.RegionChecker</a>
 extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <div class="block">Checks regions using MetaTableAccessor and HTable methods</div>
 </li>
@@ -256,7 +256,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>org.apache.hadoop.hbase.client.Connection <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.213">connection</a></pre>
+<pre>org.apache.hadoop.hbase.client.Connection <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.293">connection</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -265,7 +265,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.214">conf</a></pre>
+<pre>org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.294">conf</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -274,7 +274,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.215">tableName</a></pre>
+<pre>org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.295">tableName</a></pre>
 </li>
 </ul>
 <a name="ex">
@@ -283,7 +283,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ex</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.216">ex</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.296">ex</a></pre>
 </li>
 </ul>
 </li>
@@ -300,7 +300,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionChecker</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.218">RegionChecker</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.298">RegionChecker</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
               org.apache.hadoop.hbase.Stoppable&nbsp;stopper,
               org.apache.hadoop.hbase.TableName&nbsp;tableName)
        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>
@@ -324,7 +324,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyRegionsUsingMetaTableAccessor</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.227">verifyRegionsUsingMetaTableAccessor</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.307">verifyRegionsUsingMetaTableAccessor</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>
 <div class="block">verify region boundaries obtained from MetaScanner</div>
 <dl>
@@ -339,7 +339,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyRegionsUsingHTable</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.235">verifyRegionsUsingHTable</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.317">verifyRegionsUsingHTable</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">verify region boundaries obtained from HTable.getStartEndKeys()</div>
 <dl>
@@ -354,7 +354,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>verify</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.257">verify</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.339">verify</a>()
      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -368,7 +368,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyTableRegions</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.262">verifyTableRegions</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;org.apache.hadoop.hbase.client.RegionInfo&gt;&nbsp;regions)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.344">verifyTableRegions</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;org.apache.hadoop.hbase.client.RegionInfo&gt;&nbsp;regions)</pre>
 </li>
 </ul>
 <a name="verifyStartEndKeys-org.apache.hadoop.hbase.util.Pair-">
@@ -377,7 +377,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyStartEndKeys</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.279">verifyStartEndKeys</a>(org.apache.hadoop.hbase.util.Pair&lt;byte[][],byte[][]&gt;&nbsp;keys)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.361">verifyStartEndKeys</a>(org.apache.hadoop.hbase.util.Pair&lt;byte[][],byte[][]&gt;&nbsp;keys)</pre>
 </li>
 </ul>
 <a name="chore--">
@@ -386,7 +386,7 @@ extends org.apache.hadoop.hbase.ScheduledChore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>chore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.302">chore</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html#line.384">chore</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>chore</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.ScheduledChore</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
index b1d10f1..7517637 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.132">TestEndToEndSplitTransaction.RegionSplitter</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.213">TestEndToEndSplitTransaction.RegionSplitter</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -267,7 +267,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>final&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.133">connection</a></pre>
+<pre>final&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.214">connection</a></pre>
 </li>
 </ul>
 <a name="ex">
@@ -276,7 +276,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ex</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.134">ex</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.215">ex</a></pre>
 </li>
 </ul>
 <a name="table">
@@ -285,7 +285,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>table</h4>
-<pre>org.apache.hadoop.hbase.client.Table <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.135">table</a></pre>
+<pre>org.apache.hadoop.hbase.client.Table <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.216">table</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -294,7 +294,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.136">tableName</a></pre>
+<pre>org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.217">tableName</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -303,7 +303,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>family</h4>
-<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.137">family</a></pre>
+<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.218">family</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -312,7 +312,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>admin</h4>
-<pre>org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.138">admin</a></pre>
+<pre>org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.219">admin</a></pre>
 </li>
 </ul>
 <a name="rs">
@@ -321,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rs</h4>
-<pre>org.apache.hadoop.hbase.regionserver.HRegionServer <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.139">rs</a></pre>
+<pre>org.apache.hadoop.hbase.regionserver.HRegionServer <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.220">rs</a></pre>
 </li>
 </ul>
 </li>
@@ -338,7 +338,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionSplitter</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.141">RegionSplitter</a>(org.apache.hadoop.hbase.client.Table&nbsp;table)
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.222">RegionSplitter</a>(org.apache.hadoop.hbase.client.Table&nbsp;table)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -360,7 +360,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.151">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.232">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -375,7 +375,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>addData</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.198">addData</a>(int&nbsp;start)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#line.278">addData</a>(int&nbsp;start)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
index 42a2f06..1689eb1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":10};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":10,"i10":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";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.71">TestEndToEndSplitTransaction</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.80">TestEndToEndSplitTransaction</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>
@@ -252,6 +252,16 @@ 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/regionserver/TestEndToEndSplitTransaction.html#log-java.lang.String-">log</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;msg)</code>&nbsp;</td>
 </tr>
 <tr id="i8" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#removeCompactedFiles-org.apache.hadoop.hbase.client.Connection-long-org.apache.hadoop.hbase.client.RegionInfo-">removeCompactedFiles</a></span>(org.apache.hadoop.hbase.client.Connection&nbsp;conn,
+                    long&nbsp;timeout,
+                    org.apache.hadoop.hbase.client.RegionInfo&nbsp;hri)</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/regionserver/TestEndToEndSplitTransaction.html#testCanSplitJustAfterASplit--">testCanSplitJustAfterASplit</a></span>()</code>&nbsp;</td>
+</tr>
+<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/regionserver/TestEndToEndSplitTransaction.html#testFromClientSideWhileSplitting--">testFromClientSideWhileSplitting</a></span>()</code>
 <div class="block">Tests that the client sees meta table changes as atomic during splits</div>
@@ -285,7 +295,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.74">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.83">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -294,7 +304,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <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/regionserver/TestEndToEndSplitTransaction.html#line.77">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.86">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -303,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.78">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.87">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="CONF">
@@ -312,7 +322,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CONF</h4>
-<pre>private static final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.79">CONF</a></pre>
+<pre>private static final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.88">CONF</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -321,7 +331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.82">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.91">name</a></pre>
 </li>
 </ul>
 </li>
@@ -338,7 +348,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestEndToEndSplitTransaction</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.71">TestEndToEndSplitTransaction</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.80">TestEndToEndSplitTransaction</a>()</pre>
 </li>
 </ul>
 </li>
@@ -355,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>beforeAllTests</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.85">beforeAllTests</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.94">beforeAllTests</a>()
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -369,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>afterAllTests</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.91">afterAllTests</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.100">afterAllTests</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -377,13 +387,27 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testCanSplitJustAfterASplit--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testCanSplitJustAfterASplit</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.111">testCanSplitJustAfterASplit</a>()
+                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="testFromClientSideWhileSplitting--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testFromClientSideWhileSplitting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.99">testFromClientSideWhileSplitting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.180">testFromClientSideWhileSplitting</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a></pre>
 <div class="block">Tests that the client sees meta table changes as atomic during splits</div>
 <dl>
@@ -398,7 +422,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>log</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.312">log</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;msg)</pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.394">log</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;msg)</pre>
 </li>
 </ul>
 <a name="flushAndBlockUntilDone-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.regionserver.HRegionServer-byte:A-">
@@ -407,7 +431,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>flushAndBlockUntilDone</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.318">flushAndBlockUntilDone</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.400">flushAndBlockUntilDone</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                                           org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;rs,
                                           byte[]&nbsp;regionName)
                                    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>,
@@ -425,7 +449,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compactAndBlockUntilDone</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.329">compactAndBlockUntilDone</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.411">compactAndBlockUntilDone</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                                             org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;rs,
                                             byte[]&nbsp;regionName)
                                      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>,
@@ -443,7 +467,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>blockUntilRegionSplit</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.347">blockUntilRegionSplit</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.431">blockUntilRegionSplit</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                          long&nbsp;timeout,
                                          byte[]&nbsp;regionName,
                                          boolean&nbsp;waitForDaughters)
@@ -457,13 +481,31 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="removeCompactedFiles-org.apache.hadoop.hbase.client.Connection-long-org.apache.hadoop.hbase.client.RegionInfo-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>removeCompactedFiles</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.489">removeCompactedFiles</a>(org.apache.hadoop.hbase.client.Connection&nbsp;conn,
+                                        long&nbsp;timeout,
+                                        org.apache.hadoop.hbase.client.RegionInfo&nbsp;hri)
+                                 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>,
+                                        <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>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
 <a name="blockUntilRegionIsInMeta-org.apache.hadoop.hbase.client.Connection-long-org.apache.hadoop.hbase.client.RegionInfo-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>blockUntilRegionIsInMeta</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.396">blockUntilRegionIsInMeta</a>(org.apache.hadoop.hbase.client.Connection&nbsp;conn,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.502">blockUntilRegionIsInMeta</a>(org.apache.hadoop.hbase.client.Connection&nbsp;conn,
                                             long&nbsp;timeout,
                                             org.apache.hadoop.hbase.client.RegionInfo&nbsp;hri)
                                      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>,
@@ -481,7 +523,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>blockUntilRegionIsOpened</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.410">blockUntilRegionIsOpened</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#line.516">blockUntilRegionIsOpened</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                             long&nbsp;timeout,
                                             org.apache.hadoop.hbase.client.RegionInfo&nbsp;hri)
                                      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>,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
index 4330473..a91f221 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":9,"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":9};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":9,"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":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.85">TestHStoreFile</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.86">TestHStoreFile</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" title="class in org.apache.hadoop.hbase">HBaseTestCase</a></pre>
 <div class="block">Test HStoreFile</div>
 </li>
@@ -364,17 +364,21 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#testSeqIdComparator--">testSeqIdComparator</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i22" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#testStoreFileReference--">testStoreFileReference</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.StoreFileWriter</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#writeStoreFile-org.apache.hadoop.conf.Configuration-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.fs.Path-int-">writeStoreFile</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
               org.apache.hadoop.hbase.io.hfile.CacheConfig&nbsp;cacheConf,
               org.apache.hadoop.fs.Path&nbsp;path,
               int&nbsp;numBlocks)</code>&nbsp;</td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#writeStoreFile-org.apache.hadoop.hbase.regionserver.StoreFileWriter-">writeStoreFile</a></span>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer)</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#writeStoreFile-org.apache.hadoop.hbase.regionserver.StoreFileWriter-byte:A-byte:A-">writeStoreFile</a></span>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer,
               byte[]&nbsp;fam,
@@ -422,7 +426,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.88">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.89">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -431,7 +435,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <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/regionserver/TestHStoreFile.html#line.91">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.92">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -440,7 +444,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.92">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.93">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="cacheConf">
@@ -449,7 +453,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheConf</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.io.hfile.CacheConfig <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.93">cacheConf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.io.hfile.CacheConfig <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.94">cacheConf</a></pre>
 </li>
 </ul>
 <a name="ROOT_DIR">
@@ -458,7 +462,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>ROOT_DIR</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/regionserver/TestHStoreFile.html#line.94">ROOT_DIR</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/regionserver/TestHStoreFile.html#line.95">ROOT_DIR</a></pre>
 </li>
 </ul>
 <a name="CKTYPE">
@@ -467,7 +471,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>CKTYPE</h4>
-<pre>private static final&nbsp;org.apache.hadoop.hbase.util.ChecksumType <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.95">CKTYPE</a></pre>
+<pre>private static final&nbsp;org.apache.hadoop.hbase.util.ChecksumType <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.96">CKTYPE</a></pre>
 </li>
 </ul>
 <a name="CKBYTES">
@@ -476,7 +480,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>CKBYTES</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.96">CKBYTES</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.97">CKBYTES</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestHStoreFile.CKBYTES">Constant Field Values</a></dd>
@@ -489,7 +493,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY</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/regionserver/TestHStoreFile.html#line.97">TEST_FAMILY</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/regionserver/TestHStoreFile.html#line.98">TEST_FAMILY</a></pre>
 </li>
 </ul>
 <a name="SPLITKEY">
@@ -498,7 +502,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>SPLITKEY</h4>
-<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.140">SPLITKEY</a></pre>
+<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.141">SPLITKEY</a></pre>
 </li>
 </ul>
 <a name="localFormatter">
@@ -507,7 +511,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>localFormatter</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/regionserver/TestHStoreFile.html#line.508">localFormatter</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/regionserver/TestHStoreFile.html#line.538">localFormatter</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestHStoreFile.localFormatter">Constant Field Values</a></dd>
@@ -520,7 +524,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BLOCKSIZE_SMALL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.556">BLOCKSIZE_SMALL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.586">BLOCKSIZE_SMALL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestHStoreFile.BLOCKSIZE_SMALL">Constant Field Values</a></dd>
@@ -541,7 +545,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestHStoreFile</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.85">TestHStoreFile</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.86">TestHStoreFile</a>()</pre>
 </li>
 </ul>
 </li>
@@ -558,7 +562,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.101">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.102">setUp</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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html#setUp--">HBaseTestCase</a></code></span></div>
 <div class="block">Note that this method must be called after the mini hdfs cluster has
@@ -577,7 +581,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.107">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.108">tearDown</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">Overrides:</span></dt>
@@ -593,7 +597,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testBasicHalfMapFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.117">testBasicHalfMapFile</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.118">testBasicHalfMapFile</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>
 <div class="block">Write a file and then assert that we can read from top and bottom halves
  using two HalfMapFiles.</div>
@@ -609,7 +613,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>writeStoreFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.135">writeStoreFile</a>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.136">writeStoreFile</a>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer)
                      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>
@@ -623,7 +627,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>writeStoreFile</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.148">writeStoreFile</a>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.149">writeStoreFile</a>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer,
                                   byte[]&nbsp;fam,
                                   byte[]&nbsp;qualifier)
                            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>
@@ -639,7 +643,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testReference</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.169">testReference</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.170">testReference</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">Test that our mechanism of writing store files in one region to reference
  store files in other regions works.</div>
@@ -649,13 +653,27 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 </dl>
 </li>
 </ul>
+<a name="testStoreFileReference--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testStoreFileReference</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.217">testStoreFileReference</a>()
+                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="testEmptyStoreFileRestrictKeyRanges--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testEmptyStoreFileRestrictKeyRanges</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.216">testEmptyStoreFileRestrictKeyRanges</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.246">testEmptyStoreFileRestrictKeyRanges</a>()
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -669,7 +687,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testHFileLink</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.230">testHFileLink</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.260">testHFileLink</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -683,7 +701,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testReferenceToHFileLink</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.274">testReferenceToHFileLink</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.304">testReferenceToHFileLink</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">This test creates an hfile and then the dir structures and files to verify that references
  to hfilelinks (created by snapshot clones) can be properly interpreted.</div>
@@ -699,7 +717,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>checkHalfHFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.350">checkHalfHFile</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;regionFs,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.380">checkHalfHFile</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;regionFs,
                             org.apache.hadoop.hbase.regionserver.HStoreFile&nbsp;f)
                      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>
@@ -714,7 +732,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileScanner</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.503">getStoreFileScanner</a>(org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;reader,
+<pre>private static&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.533">getStoreFileScanner</a>(org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;reader,
                                                                                          boolean&nbsp;cacheBlocks,
                                                                                          boolean&nbsp;pread)</pre>
 </li>
@@ -725,7 +743,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>bloomWriteRead</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.510">bloomWriteRead</a>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.540">bloomWriteRead</a>(org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;writer,
                             org.apache.hadoop.fs.FileSystem&nbsp;fs)
                      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>
@@ -740,7 +758,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.559">testBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.589">testBloomFilter</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -754,7 +772,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteFamilyBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.580">testDeleteFamilyBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.610">testDeleteFamilyBloomFilter</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -768,7 +786,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testReseek</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.643">testReseek</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.673">testReseek</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>
 <div class="block">Test for HBASE-8012</div>
 <dl>
@@ -783,7 +801,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testBloomTypes</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.669">testBloomTypes</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.699">testBloomTypes</a>()
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -797,7 +815,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testSeqIdComparator</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.762">testSeqIdComparator</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.792">testSeqIdComparator</a>()</pre>
 </li>
 </ul>
 <a name="assertOrdering-java.util.Comparator-org.apache.hadoop.hbase.regionserver.HStoreFile...-">
@@ -806,7 +824,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>assertOrdering</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.775">assertOrdering</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;? super org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;comparator,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.805">assertOrdering</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;? super org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;comparator,
                             org.apache.hadoop.hbase.regionserver.HStoreFile...&nbsp;sfs)</pre>
 <div class="block">Assert that the given comparator orders the given storefiles in the
  same way that they're passed.</div>
@@ -818,7 +836,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>mockStoreFile</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HStoreFile&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.787">mockStoreFile</a>(boolean&nbsp;bulkLoad,
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HStoreFile&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.817">mockStoreFile</a>(boolean&nbsp;bulkLoad,
                                                                       long&nbsp;size,
                                                                       long&nbsp;bulkTimestamp,
                                                                       long&nbsp;seqId,
@@ -832,7 +850,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getKeyValueSet</h4>
-<pre><a href="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.KeyValue&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.818">getKeyValueSet</a>(long[]&nbsp;timestamps,
+<pre><a href="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.KeyValue&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.848">getKeyValueSet</a>(long[]&nbsp;timestamps,
                                                       int&nbsp;numRows,
                                                       byte[]&nbsp;qualifier,
                                                       byte[]&nbsp;family)</pre>
@@ -853,7 +871,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testMultipleTimestamps</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.838">testMultipleTimestamps</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.868">testMultipleTimestamps</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">Test to ensure correctness when using StoreFile with multiple timestamps</div>
 <dl>
@@ -868,7 +886,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>testCacheOnWriteEvictOnClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.901">testCacheOnWriteEvictOnClose</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.931">testCacheOnWriteEvictOnClose</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -882,7 +900,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>splitStoreFile</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.1024">splitStoreFile</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;regionFs,
+<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.1054">splitStoreFile</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;regionFs,
                                                  org.apache.hadoop.hbase.HRegionInfo&nbsp;hri,
                                                  <a href="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;family,
                                                  org.apache.hadoop.hbase.regionserver.HStoreFile&nbsp;sf,
@@ -901,7 +919,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>writeStoreFile</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.1036">writeStoreFile</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileWriter&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.1066">writeStoreFile</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                             org.apache.hadoop.hbase.io.hfile.CacheConfig&nbsp;cacheConf,
                                                                             org.apache.hadoop.fs.Path&nbsp;path,
                                                                             int&nbsp;numBlocks)
@@ -918,7 +936,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/HBaseTestCase.html" titl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testDataBlockEncodingMetaData</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.1076">testDataBlockEncodingMetaData</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#line.1106">testDataBlockEncodingMetaData</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">Check if data block encoding information is saved correctly in HFile's
  file info.</div>


[09/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
index 740e531..7aea77c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html
@@ -32,411 +32,519 @@
 <span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Random;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Set;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.TreeSet;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.stream.Collectors;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.commons.io.IOUtils;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.ChoreService;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HConstants;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.ScheduledChore;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.Stoppable;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.TableName;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Get;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Put;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Result;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Table;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.PairOfSameType;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.util.StoppableImplementation;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.AfterClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.BeforeClass;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.ClassRule;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Rule;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.rules.TestName;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.slf4j.Logger;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.slf4j.LoggerFactory;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterators;<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>@Category(LargeTests.class)<a name="line.70"></a>
-<span class="sourceLineNo">071</span>public class TestEndToEndSplitTransaction {<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  @ClassRule<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      HBaseClassTestRule.forClass(TestEndToEndSplitTransaction.class);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(TestEndToEndSplitTransaction.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final Configuration CONF = TEST_UTIL.getConfiguration();<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  @Rule<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public TestName name = new TestName();<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  @BeforeClass<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public static void beforeAllTests() throws Exception {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    TEST_UTIL.startMiniCluster();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
+<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Random;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Set;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.TreeSet;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.stream.Collectors;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.commons.io.IOUtils;<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.hbase.ChoreService;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HConstants;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.ScheduledChore;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.Stoppable;<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.client.Admin;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Get;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Put;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Result;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Table;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<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.PairOfSameType;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.util.StoppableImplementation;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterators;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.junit.AfterClass;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.Assert;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.BeforeClass;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.junit.ClassRule;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.Rule;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Test;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.experimental.categories.Category;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.rules.TestName;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.slf4j.Logger;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.slf4j.LoggerFactory;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>@Category(LargeTests.class)<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class TestEndToEndSplitTransaction {<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  @ClassRule<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      HBaseClassTestRule.forClass(TestEndToEndSplitTransaction.class);<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(TestEndToEndSplitTransaction.class);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final Configuration CONF = TEST_UTIL.getConfiguration();<a name="line.88"></a>
 <span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  @AfterClass<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public static void afterAllTests() throws Exception {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * Tests that the client sees meta table changes as atomic during splits<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public void testFromClientSideWhileSplitting() throws Throwable {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    LOG.info("Starting testFromClientSideWhileSplitting");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    final byte[] FAMILY = Bytes.toBytes("family");<a name="line.102"></a>
+<span class="sourceLineNo">090</span>  @Rule<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public TestName name = new TestName();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @BeforeClass<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static void beforeAllTests() throws Exception {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    TEST_UTIL.startMiniCluster();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  @AfterClass<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static void afterAllTests() throws Exception {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
 <span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //SplitTransaction will update the meta table by offlining the parent region, and adding info<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    //for daughters.<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    Table table = TEST_UTIL.createTable(tableName, FAMILY);<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>    Stoppable stopper = new StoppableImplementation();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    RegionSplitter regionSplitter = new RegionSplitter(table);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    RegionChecker regionChecker = new RegionChecker(CONF, stopper, tableName);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    final ChoreService choreService = new ChoreService("TEST_SERVER");<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>    choreService.scheduleChore(regionChecker);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    regionSplitter.start();<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    //wait until the splitter is finished<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    regionSplitter.join();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    stopper.stop(null);<a name="line.118"></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>   * This is the test for : HBASE-20940 This test will split the region and try to open an reference<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * over store file. Once store file has any reference, it makes sure that region can't be split<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * @throws Exception<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public void testCanSplitJustAfterASplit() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    LOG.info("Starting testCanSplitJustAfterASplit");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    byte[] fam = Bytes.toBytes("cf_split");<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>    TableName tableName = TableName.valueOf("CanSplitTable");<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    Table source = TEST_UTIL.getConnection().getTable(tableName);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    Map&lt;String, StoreFileReader&gt; scanner = Maps.newHashMap();<a name="line.118"></a>
 <span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (regionChecker.ex != null) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      throw new AssertionError("regionChecker", regionChecker.ex);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">120</span>    try {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      TableDescriptor htd = TableDescriptorBuilder.newBuilder(tableName)<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          .setColumnFamily(ColumnFamilyDescriptorBuilder.of(fam)).build();<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (regionSplitter.ex != null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      throw new AssertionError("regionSplitter", regionSplitter.ex);<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>    //one final check<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    regionChecker.verify();<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>  static class RegionSplitter extends Thread {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    final Connection connection;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    Throwable ex;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    Table table;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TableName tableName;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    byte[] family;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Admin admin;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    HRegionServer rs;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    RegionSplitter(Table table) throws IOException {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      this.table = table;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      this.tableName = table.getName();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      this.family = table.getTableDescriptor().getFamiliesKeys().iterator().next();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      admin = TEST_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      connection = TEST_UTIL.getConnection();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void run() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      try {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        Random random = new Random();<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        for (int i= 0; i&lt; 5; i++) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          List&lt;RegionInfo&gt; regions =<a name="line.155"></a>
-<span class="sourceLineNo">156</span>              MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          if (regions.isEmpty()) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>            continue;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>          }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>          int regionIndex = random.nextInt(regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>          //pick a random region and split it into two<a name="line.162"></a>
-<span class="sourceLineNo">163</span>          RegionInfo region = Iterators.get(regions.iterator(), regionIndex);<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>          //pick the mid split point<a name="line.165"></a>
-<span class="sourceLineNo">166</span>          int start = 0, end = Integer.MAX_VALUE;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          if (region.getStartKey().length &gt; 0) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>            start = Bytes.toInt(region.getStartKey());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          if (region.getEndKey().length &gt; 0) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>            end = Bytes.toInt(region.getEndKey());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          int mid = start + ((end - start) / 2);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          byte[] splitPoint = Bytes.toBytes(mid);<a name="line.174"></a>
+<span class="sourceLineNo">124</span>      admin.createTable(htd);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      TEST_UTIL.loadTable(source, fam);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      List&lt;HRegion&gt; regions = TEST_UTIL.getHBaseCluster().getRegions(tableName);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      regions.get(0).forceSplit(null);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      admin.split(tableName);<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>      while (regions.size() &lt;= 1) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        regions = TEST_UTIL.getHBaseCluster().getRegions(tableName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        regions.stream()<a name="line.132"></a>
+<span class="sourceLineNo">133</span>            .forEach(r -&gt; r.getStores().get(0).getStorefiles().stream()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                .filter(<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                  s -&gt; s.isReference() &amp;&amp; !scanner.containsKey(r.getRegionInfo().getEncodedName()))<a name="line.135"></a>
+<span class="sourceLineNo">136</span>                .forEach(sf -&gt; {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>                  StoreFileReader reader = ((HStoreFile) sf).getReader();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                  reader.getStoreFileScanner(true, false, false, 0, 0, false);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>                  scanner.put(r.getRegionInfo().getEncodedName(), reader);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>                  LOG.info("Got reference to file = " + sf.getPath() + ",for region = "<a name="line.140"></a>
+<span class="sourceLineNo">141</span>                      + r.getRegionInfo().getEncodedName());<a name="line.141"></a>
+<span class="sourceLineNo">142</span>                }));<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>      Assert.assertTrue("Regions did not split properly", regions.size() &gt; 1);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      Assert.assertTrue("Could not get reference any of the store file", scanner.size() &gt; 1);<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>      RetryCounter retrier = new RetryCounter(30, 1, TimeUnit.SECONDS);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      while (CompactionState.NONE != admin.getCompactionState(tableName) &amp;&amp; retrier.shouldRetry()) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        retrier.sleepUntilNextRetry();<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>      Assert.assertEquals("Compaction did not complete in 30 secs", CompactionState.NONE,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        admin.getCompactionState(tableName));<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>      regions.stream()<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          .filter(region -&gt; scanner.containsKey(region.getRegionInfo().getEncodedName()))<a name="line.157"></a>
+<span class="sourceLineNo">158</span>          .forEach(r -&gt; Assert.assertTrue("Contains an open file reference which can be split",<a name="line.158"></a>
+<span class="sourceLineNo">159</span>            !r.getStores().get(0).canSplit()));<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    } finally {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      scanner.values().stream().forEach(s -&gt; {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        try {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          s.close(true);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        } catch (IOException ioe) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          LOG.error("Failed while closing store file", ioe);<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>      scanner.clear();<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      if (source != null) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        source.close();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      TEST_UTIL.deleteTableIfAny(tableName);<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><a name="line.175"></a>
-<span class="sourceLineNo">176</span>          //put some rows to the regions<a name="line.176"></a>
-<span class="sourceLineNo">177</span>          addData(start);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>          addData(mid);<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>          flushAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          compactAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>          log("Initiating region split for:" + region.getRegionNameAsString());<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>            admin.splitRegion(region.getRegionName(), splitPoint);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>            //wait until the split is complete<a name="line.186"></a>
-<span class="sourceLineNo">187</span>            blockUntilRegionSplit(CONF, 50000, region.getRegionName(), true);<a name="line.187"></a>
+<span class="sourceLineNo">176</span>  /**<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * Tests that the client sees meta table changes as atomic during splits<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Test<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void testFromClientSideWhileSplitting() throws Throwable {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    LOG.info("Starting testFromClientSideWhileSplitting");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    final byte[] FAMILY = Bytes.toBytes("family");<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>    //SplitTransaction will update the meta table by offlining the parent region, and adding info<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    //for daughters.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    Table table = TEST_UTIL.createTable(tableName, FAMILY);<a name="line.187"></a>
 <span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>          } catch (NotServingRegionException ex) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>            //ignore<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>      } catch (Throwable ex) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        this.ex = ex;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>    void addData(int start) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      for (int i=start; i&lt; start + 100; i++) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        put.addColumn(family, family, Bytes.toBytes(i));<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        puts.add(put);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      table.put(puts);<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">189</span>    Stoppable stopper = new StoppableImplementation();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    RegionSplitter regionSplitter = new RegionSplitter(table);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    RegionChecker regionChecker = new RegionChecker(CONF, stopper, tableName);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    final ChoreService choreService = new ChoreService("TEST_SERVER");<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    choreService.scheduleChore(regionChecker);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    regionSplitter.start();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    //wait until the splitter is finished<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    regionSplitter.join();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    stopper.stop(null);<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (regionChecker.ex != null) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      throw new AssertionError("regionChecker", regionChecker.ex);<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>    if (regionSplitter.ex != null) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      throw new AssertionError("regionSplitter", regionSplitter.ex);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Checks regions using MetaTableAccessor and HTable methods<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  static class RegionChecker extends ScheduledChore {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    Connection connection;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Configuration conf;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    TableName tableName;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    Throwable ex;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    RegionChecker(Configuration conf, Stoppable stopper, TableName tableName) throws IOException {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      super("RegionChecker", stopper, 10);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.conf = conf;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      this.tableName = tableName;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>      this.connection = ConnectionFactory.createConnection(conf);<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>    /** verify region boundaries obtained from MetaScanner */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    void verifyRegionsUsingMetaTableAccessor() throws Exception {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      List&lt;RegionInfo&gt; regionList = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      verifyTableRegions(regionList.stream().collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      regionList = MetaTableAccessor.getAllRegions(connection, true);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      verifyTableRegions(regionList.stream().collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<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>    /** verify region boundaries obtained from HTable.getStartEndKeys() */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    void verifyRegionsUsingHTable() throws IOException {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      Table table = null;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        //HTable.getStartEndKeys()<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        table = connection.getTable(tableName);<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>        try(RegionLocator rl = connection.getRegionLocator(tableName)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          Pair&lt;byte[][], byte[][]&gt; keys = rl.getStartEndKeys();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          verifyStartEndKeys(keys);<a name="line.243"></a>
+<span class="sourceLineNo">209</span>    //one final check<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    regionChecker.verify();<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>  static class RegionSplitter extends Thread {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    final Connection connection;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    Throwable ex;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    Table table;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    TableName tableName;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    byte[] family;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    Admin admin;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    HRegionServer rs;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    RegionSplitter(Table table) throws IOException {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      this.table = table;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      this.tableName = table.getName();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      this.family = table.getTableDescriptor().getFamiliesKeys().iterator().next();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      admin = TEST_UTIL.getAdmin();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      connection = TEST_UTIL.getConnection();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    public void run() {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        Random random = new Random();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        for (int i = 0; i &lt; 5; i++) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>          List&lt;RegionInfo&gt; regions = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>          if (regions.isEmpty()) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            continue;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          int regionIndex = random.nextInt(regions.size());<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>          // pick a random region and split it into two<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          RegionInfo region = Iterators.get(regions.iterator(), regionIndex);<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>          Set&lt;RegionInfo&gt; regions = new TreeSet&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          for (HRegionLocation loc : rl.getAllRegionLocations()) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            regions.add(loc.getRegionInfo());<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          verifyTableRegions(regions);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>      } finally {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        IOUtils.closeQuietly(table);<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>    void verify() throws Exception {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      verifyRegionsUsingMetaTableAccessor();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      verifyRegionsUsingHTable();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    void verifyTableRegions(Set&lt;RegionInfo&gt; regions) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      log("Verifying " + regions.size() + " regions: " + regions);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>      byte[][] startKeys = new byte[regions.size()][];<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      byte[][] endKeys = new byte[regions.size()][];<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>      int i=0;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (RegionInfo region : regions) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        startKeys[i] = region.getStartKey();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        endKeys[i] = region.getEndKey();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        i++;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>      Pair&lt;byte[][], byte[][]&gt; keys = new Pair&lt;&gt;(startKeys, endKeys);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      verifyStartEndKeys(keys);<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>    void verifyStartEndKeys(Pair&lt;byte[][], byte[][]&gt; keys) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      byte[][] startKeys = keys.getFirst();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      byte[][] endKeys = keys.getSecond();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      assertEquals(startKeys.length, endKeys.length);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      assertTrue("Found 0 regions for the table", startKeys.length &gt; 0);<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>      assertArrayEquals("Start key for the first region is not byte[0]",<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          HConstants.EMPTY_START_ROW, startKeys[0]);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      byte[] prevEndKey = HConstants.EMPTY_START_ROW;<a name="line.287"></a>
+<span class="sourceLineNo">245</span>          // pick the mid split point<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          int start = 0, end = Integer.MAX_VALUE;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          if (region.getStartKey().length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>            start = Bytes.toInt(region.getStartKey());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          if (region.getEndKey().length &gt; 0) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>            end = Bytes.toInt(region.getEndKey());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          }<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          int mid = start + ((end - start) / 2);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          byte[] splitPoint = Bytes.toBytes(mid);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>          // put some rows to the regions<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          addData(start);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          addData(mid);<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>          flushAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          compactAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>          log("Initiating region split for:" + region.getRegionNameAsString());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            admin.splitRegion(region.getRegionName(), splitPoint);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            // wait until the split is complete<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            blockUntilRegionSplit(CONF, 50000, region.getRegionName(), true);<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>          } catch (NotServingRegionException ex) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>            // ignore<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      } catch (Throwable ex) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        this.ex = ex;<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><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    void addData(int start) throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      for (int i=start; i&lt; start + 100; i++) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        put.addColumn(family, family, Bytes.toBytes(i));<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        puts.add(put);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      table.put(puts);<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>      // ensure that we do not have any gaps<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i=0; i&lt;startKeys.length; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        assertArrayEquals(<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            "Hole in hbase:meta is detected. prevEndKey=" + Bytes.toStringBinary(prevEndKey)<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                + " ,regionStartKey=" + Bytes.toStringBinary(startKeys[i]), prevEndKey,<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            startKeys[i]);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        prevEndKey = endKeys[i];<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      assertArrayEquals("End key for the last region is not byte[0]", HConstants.EMPTY_END_ROW,<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          endKeys[endKeys.length - 1]);<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>    @Override<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    protected void chore() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        verify();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      } catch (Throwable ex) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        this.ex = ex;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        getStopper().stop("caught exception");<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><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public static void log(String msg) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    LOG.info(msg);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Checks regions using MetaTableAccessor and HTable methods<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  static class RegionChecker extends ScheduledChore {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Connection connection;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    Configuration conf;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    TableName tableName;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    Throwable ex;<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    RegionChecker(Configuration conf, Stoppable stopper, TableName tableName) throws IOException {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      super("RegionChecker", stopper, 10);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      this.conf = conf;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      this.tableName = tableName;<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      this.connection = ConnectionFactory.createConnection(conf);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    /** verify region boundaries obtained from MetaScanner */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    void verifyRegionsUsingMetaTableAccessor() throws Exception {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      List&lt;RegionInfo&gt; regionList = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      verifyTableRegions(regionList.stream()<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          .collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      regionList = MetaTableAccessor.getAllRegions(connection, true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      verifyTableRegions(regionList.stream()<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          .collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
 <span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>  /* some utility methods for split tests */<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public static void flushAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      throws IOException, InterruptedException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    log("flushing region: " + Bytes.toStringBinary(regionName));<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    admin.flushRegion(regionName);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    log("blocking until flush is complete: " + Bytes.toStringBinary(regionName));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    Threads.sleepWithoutInterrupt(500);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    while (rs.getOnlineRegion(regionName).getMemStoreDataSize() &gt; 0) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      Threads.sleep(50);<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>  public static void compactAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      throws IOException, InterruptedException {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    log("Compacting region: " + Bytes.toStringBinary(regionName));<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    admin.majorCompactRegion(regionName);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    log("blocking until compaction is complete: " + Bytes.toStringBinary(regionName));<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    Threads.sleepWithoutInterrupt(500);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    outer: for (;;) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      for (Store store : rs.getOnlineRegion(regionName).getStores()) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        if (store.getStorefilesCount() &gt; 1) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          Threads.sleep(50);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          continue outer;<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>      break;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  /** Blocks until the region split is complete in hbase:meta and region server opens the daughters */<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public static void blockUntilRegionSplit(Configuration conf, long timeout,<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      final byte[] regionName, boolean waitForDaughters)<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      throws IOException, InterruptedException {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    long start = System.currentTimeMillis();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    log("blocking until region is split:" +  Bytes.toStringBinary(regionName));<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    RegionInfo daughterA = null, daughterB = null;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      Result result = null;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      RegionInfo region = null;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      while ((System.currentTimeMillis() - start) &lt; timeout) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        result = metaTable.get(new Get(regionName));<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (result == null) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          break;<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>        region = MetaTableAccessor.getRegionInfo(result);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        if (region.isSplitParent()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          log("found parent region: " + region.toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          PairOfSameType&lt;RegionInfo&gt; pair = MetaTableAccessor.getDaughterRegions(result);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          daughterA = pair.getFirst();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          daughterB = pair.getSecond();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          break;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        Threads.sleep(100);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      if (daughterA == null || daughterB == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        throw new IOException("Failed to get daughters, daughterA=" + daughterA + ", daughterB=" +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          daughterB + ", timeout=" + timeout + ", result=" + result + ", regionName=" +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          Bytes.toString(regionName) + ", region=" + region);<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>      //if we are here, this means the region split is complete or timed out<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      if (waitForDaughters) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        long rem = timeout - (System.currentTimeMillis() - start);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        blockUntilRegionIsInMeta(conn, rem, daughterA);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        blockUntilRegionIsInMeta(conn, rem, daughterB);<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        blockUntilRegionIsOpened(conf, rem, daughterA);<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        blockUntilRegionIsOpened(conf, rem, daughterB);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>  public static void blockUntilRegionIsInMeta(Connection conn, long timeout, RegionInfo hri)<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      throws IOException, InterruptedException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    log("blocking until region is in META: " + hri.getRegionNameAsString());<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    long start = System.currentTimeMillis();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      HRegionLocation loc = MetaTableAccessor.getRegionLocation(conn, hri);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      if (loc != null &amp;&amp; !loc.getRegionInfo().isOffline()) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        log("found region in META: " + hri.getRegionNameAsString());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        break;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      Threads.sleep(10);<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>  public static void blockUntilRegionIsOpened(Configuration conf, long timeout, RegionInfo hri)<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      throws IOException, InterruptedException {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    log("blocking until region is opened for reading:" + hri.getRegionNameAsString());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    long start = System.currentTimeMillis();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        Table table = conn.getTable(hri.getTable())) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      byte[] row = hri.getStartKey();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // Check for null/empty row. If we find one, use a key that is likely to be in first region.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (row == null || row.length &lt;= 0) row = new byte[] { '0' };<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      Get get = new Get(row);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          table.get(get);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          break;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        } catch (IOException ex) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          // wait some more<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        Threads.sleep(10);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>}<a name="line.431"></a>
+<span class="sourceLineNo">316</span>    /** verify region boundaries obtained from HTable.getStartEndKeys() */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    void verifyRegionsUsingHTable() throws IOException {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      Table table = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      try {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        //HTable.getStartEndKeys()<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        table = connection.getTable(tableName);<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>        try(RegionLocator rl = connection.getRegionLocator(tableName)) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          Pair&lt;byte[][], byte[][]&gt; keys = rl.getStartEndKeys();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          verifyStartEndKeys(keys);<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>          Set&lt;RegionInfo&gt; regions = new TreeSet&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          for (HRegionLocation loc : rl.getAllRegionLocations()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            regions.add(loc.getRegionInfo());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          verifyTableRegions(regions);<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>      } finally {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        IOUtils.closeQuietly(table);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>    void verify() throws Exception {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      verifyRegionsUsingMetaTableAccessor();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      verifyRegionsUsingHTable();<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>    void verifyTableRegions(Set&lt;RegionInfo&gt; regions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      log("Verifying " + regions.size() + " regions: " + regions);<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>      byte[][] startKeys = new byte[regions.size()][];<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      byte[][] endKeys = new byte[regions.size()][];<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>      int i=0;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      for (RegionInfo region : regions) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        startKeys[i] = region.getStartKey();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        endKeys[i] = region.getEndKey();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        i++;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>      Pair&lt;byte[][], byte[][]&gt; keys = new Pair&lt;&gt;(startKeys, endKeys);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      verifyStartEndKeys(keys);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>    void verifyStartEndKeys(Pair&lt;byte[][], byte[][]&gt; keys) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      byte[][] startKeys = keys.getFirst();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      byte[][] endKeys = keys.getSecond();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      assertEquals(startKeys.length, endKeys.length);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      assertTrue("Found 0 regions for the table", startKeys.length &gt; 0);<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertArrayEquals("Start key for the first region is not byte[0]",<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          HConstants.EMPTY_START_ROW, startKeys[0]);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] prevEndKey = HConstants.EMPTY_START_ROW;<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>      // ensure that we do not have any gaps<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      for (int i=0; i&lt;startKeys.length; i++) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assertArrayEquals(<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            "Hole in hbase:meta is detected. prevEndKey=" + Bytes.toStringBinary(prevEndKey)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                + " ,regionStartKey=" + Bytes.toStringBinary(startKeys[i]), prevEndKey,<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            startKeys[i]);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        prevEndKey = endKeys[i];<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      assertArrayEquals("End key for the last region is not byte[0]", HConstants.EMPTY_END_ROW,<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          endKeys[endKeys.length - 1]);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    }<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>    @Override<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    protected void chore() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      try {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        verify();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      } catch (Throwable ex) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        this.ex = ex;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        getStopper().stop("caught exception");<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  public static void log(String msg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    LOG.info(msg);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  /* some utility methods for split tests */<a name="line.398"></a>
+<span class="sourceLineNo">399</span><a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public static void flushAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      throws IOException, InterruptedException {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    log("flushing region: " + Bytes.toStringBinary(regionName));<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    admin.flushRegion(regionName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    log("blocking until flush is complete: " + Bytes.toStringBinary(regionName));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    Threads.sleepWithoutInterrupt(500);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    while (rs.getOnlineRegion(regionName).getMemStoreDataSize() &gt; 0) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      Threads.sleep(50);<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>  public static void compactAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      throws IOException, InterruptedException {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    log("Compacting region: " + Bytes.toStringBinary(regionName));<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    admin.majorCompactRegion(regionName);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    log("blocking until compaction is complete: " + Bytes.toStringBinary(regionName));<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    Threads.sleepWithoutInterrupt(500);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    outer: for (;;) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      for (Store store : rs.getOnlineRegion(regionName).getStores()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        if (store.getStorefilesCount() &gt; 1) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          Threads.sleep(50);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          continue outer;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      break;<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><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  /**<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * Blocks until the region split is complete in hbase:meta and region server opens the daughters<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   */<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  public static void blockUntilRegionSplit(Configuration conf, long timeout,<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      final byte[] regionName, boolean waitForDaughters)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      throws IOException, InterruptedException {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    long start = System.currentTimeMillis();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    log("blocking until region is split:" +  Bytes.toStringBinary(regionName));<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    RegionInfo daughterA = null, daughterB = null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Result result = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      RegionInfo region = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      while ((System.currentTimeMillis() - start) &lt; timeout) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        result = metaTable.get(new Get(regionName));<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        if (result == null) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          break;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>        region = MetaTableAccessor.getRegionInfo(result);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        if (region.isSplitParent()) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>          log("found parent region: " + region.toString());<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          PairOfSameType&lt;RegionInfo&gt; pair = MetaTableAccessor.getDaughterRegions(result);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          daughterA = pair.getFirst();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          daughterB = pair.getSecond();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          break;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        Threads.sleep(100);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      if (daughterA == null || daughterB == null) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        throw new IOException("Failed to get daughters, daughterA=" + daughterA + ", daughterB=" +<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          daughterB + ", timeout=" + timeout + ", result=" + result + ", regionName=" +<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          Bytes.toString(regionName) + ", region=" + region);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>      //if we are here, this means the region split is complete or timed out<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      if (waitForDaughters) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        long rem = timeout - (System.currentTimeMillis() - start);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        blockUntilRegionIsInMeta(conn, rem, daughterA);<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        blockUntilRegionIsInMeta(conn, rem, daughterB);<a name="line.469"></a>
+<span class="sourceLineNo">470</span><a name="line.470"></a>
+<span class="sourceLineNo">471</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        blockUntilRegionIsOpened(conf, rem, daughterA);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        blockUntilRegionIsOpened(conf, rem, daughterB);<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>        // Compacting the new region to make sure references can be cleaned up<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        compactAndBlockUntilDone(TEST_UTIL.getAdmin(),<a name="line.478"></a>
+<span class="sourceLineNo">479</span>          TEST_UTIL.getMiniHBaseCluster().getRegionServer(0), daughterA.getRegionName());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>        compactAndBlockUntilDone(TEST_UTIL.getAdmin(),<a name="line.480"></a>
+<span class="sourceLineNo">481</span>          TEST_UTIL.getMiniHBaseCluster().getRegionServer(0), daughterB.getRegionName());<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>        removeCompactedFiles(conn, timeout, daughterA);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        removeCompactedFiles(conn, timeout, daughterB);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  public static void removeCompactedFiles(Connection conn, long timeout, RegionInfo hri)<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      throws IOException, InterruptedException {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    log("remove compacted files for : " + hri.getRegionNameAsString());<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    List&lt;HRegion&gt; regions = TEST_UTIL.getHBaseCluster().getRegions(hri.getTable());<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    regions.stream().forEach(r -&gt; {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      try {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        r.getStores().get(0).closeAndArchiveCompactedFiles();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      } catch (IOException ioe) {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>        LOG.error("failed in removing compacted file", ioe);<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    });<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>  public static void blockUntilRegionIsInMeta(Connection conn, long timeout, RegionInfo hri)<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      throws IOException, InterruptedException {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    log("blocking until region is in META: " + hri.getRegionNameAsString());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    long start = System.currentTimeMillis();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      HRegionLocation loc = MetaTableAccessor.getRegionLocation(conn, hri);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      if (loc != null &amp;&amp; !loc.getRegionInfo().isOffline()) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        log("found region in META: " + hri.getRegionNameAsString());<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        break;<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Threads.sleep(10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  public static void blockUntilRegionIsOpened(Configuration conf, long timeout, RegionInfo hri)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      throws IOException, InterruptedException {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    log("blocking until region is opened for reading:" + hri.getRegionNameAsString());<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    long start = System.currentTimeMillis();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        Table table = conn.getTable(hri.getTable())) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>      byte[] row = hri.getStartKey();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      // Check for null/empty row. If we find one, use a key that is likely to be in first region.<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (row == null || row.length &lt;= 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        row = new byte[] { '0' };<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      Get get = new Get(row);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        try {<a name="line.529"></a

<TRUNCATED>

[18/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
index 62ef280..007a32d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
@@ -29,144 +29,168 @@
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.master.LoadBalancer.TABLES_ON_MASTER;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
 <span class="sourceLineNo">023</span><a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.Arrays;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Collections;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.Random;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.ExecutionException;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.ExecutorService;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.Executors;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.Future;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.stream.Collectors;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.stream.IntStream;<a name="line.37"></a>
+<span class="sourceLineNo">024</span>import java.util.ArrayList;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.Collections;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Random;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.concurrent.ExecutionException;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.ExecutorService;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.Executors;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.Future;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.TimeUnit;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.stream.Collectors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.stream.IntStream;<a name="line.36"></a>
+<span class="sourceLineNo">037</span><a name="line.37"></a>
 <span class="sourceLineNo">038</span>import org.apache.commons.io.IOUtils;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.40"></a>
 <span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.MemoryCompactionPolicy;<a name="line.41"></a>
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.ServerName;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.TableName;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.io.ByteBufferPool;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.ClientTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.junit.AfterClass;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.junit.BeforeClass;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.junit.ClassRule;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.junit.Test;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.experimental.categories.Category;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>/**<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * Will split the table, and move region randomly when testing.<a name="line.58"></a>
-<span class="sourceLineNo">059</span> */<a name="line.59"></a>
-<span class="sourceLineNo">060</span>@Category({ LargeTests.class, ClientTests.class })<a name="line.60"></a>
-<span class="sourceLineNo">061</span>public class TestAsyncTableGetMultiThreaded {<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  @ClassRule<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      HBaseClassTestRule.forClass(TestAsyncTableGetMultiThreaded.class);<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.67"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.io.ByteBufferPool;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ClientTests;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.AfterClass;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.BeforeClass;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.ClassRule;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.Test;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.experimental.categories.Category;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * Will split the table, and move region randomly when testing.<a name="line.60"></a>
+<span class="sourceLineNo">061</span> */<a name="line.61"></a>
+<span class="sourceLineNo">062</span>@Category({ LargeTests.class, ClientTests.class })<a name="line.62"></a>
+<span class="sourceLineNo">063</span>public class TestAsyncTableGetMultiThreaded {<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  @ClassRule<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      HBaseClassTestRule.forClass(TestAsyncTableGetMultiThreaded.class);<a name="line.67"></a>
 <span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.69"></a>
+<span class="sourceLineNo">069</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.69"></a>
 <span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.71"></a>
+<span class="sourceLineNo">071</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.71"></a>
 <span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private static byte[] QUALIFIER = Bytes.toBytes("cq");<a name="line.73"></a>
+<span class="sourceLineNo">073</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.73"></a>
 <span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private static int COUNT = 1000;<a name="line.75"></a>
+<span class="sourceLineNo">075</span>  private static byte[] QUALIFIER = Bytes.toBytes("cq");<a name="line.75"></a>
 <span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static AsyncConnection CONN;<a name="line.77"></a>
+<span class="sourceLineNo">077</span>  private static int COUNT = 1000;<a name="line.77"></a>
 <span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static AsyncTable&lt;?&gt; TABLE;<a name="line.79"></a>
+<span class="sourceLineNo">079</span>  private static AsyncConnection CONN;<a name="line.79"></a>
 <span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static byte[][] SPLIT_KEYS;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>  private static AsyncTable&lt;?&gt; TABLE;<a name="line.81"></a>
 <span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  @BeforeClass<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public static void setUp() throws Exception {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    setUp(MemoryCompactionPolicy.NONE);<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>  protected static void setUp(MemoryCompactionPolicy memoryCompaction) throws Exception {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    TEST_UTIL.getConfiguration().set(TABLES_ON_MASTER, "none");<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    TEST_UTIL.getConfiguration().setLong(HBASE_CLIENT_META_OPERATION_TIMEOUT, 60000L);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    TEST_UTIL.getConfiguration().setInt(ByteBufferPool.MAX_POOL_SIZE_KEY, 100);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    TEST_UTIL.getConfiguration().set(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      String.valueOf(memoryCompaction));<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    TEST_UTIL.startMiniCluster(5);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    SPLIT_KEYS = new byte[8][];<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    for (int i = 111; i &lt; 999; i += 111) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      SPLIT_KEYS[i / 111 - 1] = Bytes.toBytes(String.format("%03d", i));<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    CONN = ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get();<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    TABLE = CONN.getTableBuilder(TABLE_NAME).setReadRpcTimeout(1, TimeUnit.SECONDS)<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        .setMaxRetries(1000).build();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    TABLE.putAll(<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      IntStream.range(0, COUNT).mapToObj(i -&gt; new Put(Bytes.toBytes(String.format("%03d", i)))<a name="line.106"></a>
-<span class="sourceLineNo">107</span>          .addColumn(FAMILY, QUALIFIER, Bytes.toBytes(i))).collect(Collectors.toList()))<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        .get();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  @AfterClass<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static void tearDown() throws Exception {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    IOUtils.closeQuietly(CONN);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  private void run(AtomicBoolean stop) throws InterruptedException, ExecutionException {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    while (!stop.get()) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      for (int i = 0; i &lt; COUNT; i++) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>        assertEquals(i, Bytes.toInt(TABLE.get(new Get(Bytes.toBytes(String.format("%03d", i))))<a name="line.120"></a>
-<span class="sourceLineNo">121</span>            .get().getValue(FAMILY, QUALIFIER)));<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>  }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  @Test<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public void test() throws IOException, InterruptedException, ExecutionException {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    int numThreads = 20;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    AtomicBoolean stop = new AtomicBoolean(false);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    ExecutorService executor =<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      Executors.newFixedThreadPool(numThreads, Threads.newDaemonThreadFactory("TestAsyncGet-"));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    List&lt;Future&lt;?&gt;&gt; futures = new ArrayList&lt;&gt;();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    IntStream.range(0, numThreads).forEach(i -&gt; futures.add(executor.submit(() -&gt; {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      run(stop);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      return null;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    })));<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    Collections.shuffle(Arrays.asList(SPLIT_KEYS), new Random(123));<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    for (byte[] splitPoint : SPLIT_KEYS) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      admin.split(TABLE_NAME, splitPoint);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      for (HRegion region : TEST_UTIL.getHBaseCluster().getRegions(TABLE_NAME)) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        region.compact(true);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      Thread.sleep(5000);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      admin.balance(true);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      Thread.sleep(5000);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      ServerName metaServer = TEST_UTIL.getHBaseCluster().getServerHoldingMeta();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      ServerName newMetaServer = TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream()<a name="line.148"></a>
-<span class="sourceLineNo">149</span>          .map(t -&gt; t.getRegionServer().getServerName()).filter(s -&gt; !s.equals(metaServer))<a name="line.149"></a>
-<span class="sourceLineNo">150</span>          .findAny().get();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      admin.move(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedNameAsBytes(),<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        Bytes.toBytes(newMetaServer.getServerName()));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      Thread.sleep(5000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    stop.set(true);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    executor.shutdown();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    for (Future&lt;?&gt; future : futures) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      future.get();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    }<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">083</span>  private static byte[][] SPLIT_KEYS;<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  @BeforeClass<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  public static void setUp() throws Exception {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    setUp(MemoryCompactionPolicy.NONE);<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>  protected static void setUp(MemoryCompactionPolicy memoryCompaction) throws Exception {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    TEST_UTIL.getConfiguration().set(TABLES_ON_MASTER, "none");<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    TEST_UTIL.getConfiguration().setLong(HBASE_CLIENT_META_OPERATION_TIMEOUT, 60000L);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    TEST_UTIL.getConfiguration().setInt(ByteBufferPool.MAX_POOL_SIZE_KEY, 100);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    TEST_UTIL.getConfiguration().set(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      String.valueOf(memoryCompaction));<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    TEST_UTIL.startMiniCluster(5);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    SPLIT_KEYS = new byte[8][];<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    for (int i = 111; i &lt; 999; i += 111) {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      SPLIT_KEYS[i / 111 - 1] = Bytes.toBytes(String.format("%03d", i));<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    CONN = ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    TABLE = CONN.getTableBuilder(TABLE_NAME).setReadRpcTimeout(1, TimeUnit.SECONDS)<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        .setMaxRetries(1000).build();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    TABLE.putAll(<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      IntStream.range(0, COUNT).mapToObj(i -&gt; new Put(Bytes.toBytes(String.format("%03d", i)))<a name="line.108"></a>
+<span class="sourceLineNo">109</span>          .addColumn(FAMILY, QUALIFIER, Bytes.toBytes(i))).collect(Collectors.toList()))<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        .get();<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @AfterClass<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public static void tearDown() throws Exception {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    IOUtils.closeQuietly(CONN);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    TEST_UTIL.shutdownMiniCluster();<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 void run(AtomicBoolean stop) throws InterruptedException, ExecutionException {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    while (!stop.get()) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      for (int i = 0; i &lt; COUNT; i++) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        assertEquals(i, Bytes.toInt(TABLE.get(new Get(Bytes.toBytes(String.format("%03d", i))))<a name="line.122"></a>
+<span class="sourceLineNo">123</span>            .get().getValue(FAMILY, QUALIFIER)));<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>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  @Test<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public void test() throws Exception {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    int numThreads = 20;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    AtomicBoolean stop = new AtomicBoolean(false);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    ExecutorService executor =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      Executors.newFixedThreadPool(numThreads, Threads.newDaemonThreadFactory("TestAsyncGet-"));<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    List&lt;Future&lt;?&gt;&gt; futures = new ArrayList&lt;&gt;();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    IntStream.range(0, numThreads).forEach(i -&gt; futures.add(executor.submit(() -&gt; {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      run(stop);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      return null;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    })));<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    Collections.shuffle(Arrays.asList(SPLIT_KEYS), new Random(123));<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    for (byte[] splitPoint : SPLIT_KEYS) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      int oldRegionCount = admin.getRegions(TABLE_NAME).size();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      admin.split(TABLE_NAME, splitPoint);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      TEST_UTIL.waitFor(30000, new ExplainingPredicate&lt;Exception&gt;() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        @Override<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        public boolean evaluate() throws Exception {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          return TEST_UTIL.getMiniHBaseCluster().getRegions(TABLE_NAME).size() &gt; oldRegionCount;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>        @Override<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        public String explainFailure() throws Exception {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          return "Split has not finished yet";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        }<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>      for (HRegion region : TEST_UTIL.getHBaseCluster().getRegions(TABLE_NAME)) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        region.compact(true);<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>        //Waiting for compaction to complete and references are cleaned up<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        RetryCounter retrier = new RetryCounter(30, 1, TimeUnit.SECONDS);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        while (CompactionState.NONE != admin<a name="line.161"></a>
+<span class="sourceLineNo">162</span>            .getCompactionStateForRegion(region.getRegionInfo().getRegionName())<a name="line.162"></a>
+<span class="sourceLineNo">163</span>            &amp;&amp; retrier.shouldRetry()) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          retrier.sleepUntilNextRetry();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        region.getStores().get(0).closeAndArchiveCompactedFiles();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      Thread.sleep(5000);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      admin.balance(true);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      Thread.sleep(5000);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      ServerName metaServer = TEST_UTIL.getHBaseCluster().getServerHoldingMeta();<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      ServerName newMetaServer = TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream()<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          .map(t -&gt; t.getRegionServer().getServerName()).filter(s -&gt; !s.equals(metaServer))<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          .findAny().get();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      admin.move(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedNameAsBytes(),<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        Bytes.toBytes(newMetaServer.getServerName()));<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      Thread.sleep(5000);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    stop.set(true);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    executor.shutdown();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    for (Future&lt;?&gt; future : futures) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      future.get();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>}<a name="line.185"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
index c235a59..00268f9 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
@@ -115,156 +115,160 @@
 <span class="sourceLineNo">107</span>  public static void setUpBeforeClass() throws Exception {<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    // Use a small flush size to create more HFiles.<a name="line.108"></a>
 <span class="sourceLineNo">109</span>    conf.setInt(HConstants.HREGION_MEMSTORE_FLUSH_SIZE, 1024 * 1024);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    // ((Log4JLogger)RpcServerImplementation.LOG).getLogger().setLevel(Level.TRACE);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // ((Log4JLogger)RpcClient.LOG).getLogger().setLevel(Level.TRACE);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    TEST_UTIL.startMiniCluster();<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>  @AfterClass<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  public static void tearDownAfterClass() throws Exception {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private static byte[] getRowKey(int batchId, int i) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    return Bytes.toBytes("batch" + batchId + "_row" + i);<a name="line.121"></a>
+<span class="sourceLineNo">110</span>    // Disabling split to make sure split does not cause modify column to wait which timesout test<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    // sometime<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY,<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        "org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy");<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    // ((Log4JLogger)RpcServerImplementation.LOG).getLogger().setLevel(Level.TRACE);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    // ((Log4JLogger)RpcClient.LOG).getLogger().setLevel(Level.TRACE);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    TEST_UTIL.startMiniCluster();<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>  @AfterClass<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public static void tearDownAfterClass() throws Exception {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    TEST_UTIL.shutdownMiniCluster();<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>  private static byte[] getQualifier(int j) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    return Bytes.toBytes("col" + j);<a name="line.125"></a>
+<span class="sourceLineNo">124</span>  private static byte[] getRowKey(int batchId, int i) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return Bytes.toBytes("batch" + batchId + "_row" + i);<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 static byte[] getValue(int batchId, int i, int j) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    return Bytes.toBytes("value_for_" + Bytes.toString(getRowKey(batchId, i))<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        + "_col" + j);<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>  static void writeTestDataBatch(TableName tableName,<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      int batchId) throws Exception {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    LOG.debug("Writing test data batch " + batchId);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    for (int i = 0; i &lt; NUM_ROWS_PER_BATCH; ++i) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      Put put = new Put(getRowKey(batchId, i));<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      for (int j = 0; j &lt; NUM_COLS_PER_ROW; ++j) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        put.addColumn(CF_BYTES, getQualifier(j), getValue(batchId, i, j));<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      puts.add(put);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    }<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        Table table = conn.getTable(tableName)) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      table.put(puts);<a name="line.147"></a>
+<span class="sourceLineNo">128</span>  private static byte[] getQualifier(int j) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    return Bytes.toBytes("col" + j);<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>  private static byte[] getValue(int batchId, int i, int j) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return Bytes.toBytes("value_for_" + Bytes.toString(getRowKey(batchId, i))<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        + "_col" + j);<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>  static void writeTestDataBatch(TableName tableName,<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      int batchId) throws Exception {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    LOG.debug("Writing test data batch " + batchId);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    for (int i = 0; i &lt; NUM_ROWS_PER_BATCH; ++i) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      Put put = new Put(getRowKey(batchId, i));<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      for (int j = 0; j &lt; NUM_COLS_PER_ROW; ++j) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        put.addColumn(CF_BYTES, getQualifier(j), getValue(batchId, i, j));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      puts.add(put);<a name="line.147"></a>
 <span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  static void verifyTestDataBatch(TableName tableName,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      int batchId) throws Exception {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    LOG.debug("Verifying test data batch " + batchId);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    Table table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    for (int i = 0; i &lt; NUM_ROWS_PER_BATCH; ++i) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      Get get = new Get(getRowKey(batchId, i));<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      Result result = table.get(get);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      for (int j = 0; j &lt; NUM_COLS_PER_ROW; ++j) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        Cell kv = result.getColumnLatestCell(CF_BYTES, getQualifier(j));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        if (kv == null) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>          continue;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        }<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        assertTrue(CellUtil.matchingValue(kv, getValue(batchId, i, j)));<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>    table.close();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  private void writeSomeNewData() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    writeTestDataBatch(tableName, numBatchesWritten);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    ++numBatchesWritten;<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>  private void verifyAllData() throws Exception {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    for (int i = 0; i &lt; numBatchesWritten; ++i) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      verifyTestDataBatch(tableName, i);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private void setEncodingConf(DataBlockEncoding encoding,<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      boolean onlineChange) throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    LOG.debug("Setting CF encoding to " + encoding + " (ordinal="<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      + encoding.ordinal() + "), onlineChange=" + onlineChange);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    hcd.setDataBlockEncoding(encoding);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    try (Admin admin = TEST_UTIL.getConnection().getAdmin()) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      if (!onlineChange) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        admin.disableTable(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      admin.modifyColumnFamily(tableName, hcd);<a name="line.189"></a>
+<span class="sourceLineNo">149</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        Table table = conn.getTable(tableName)) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      table.put(puts);<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><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  static void verifyTestDataBatch(TableName tableName,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      int batchId) throws Exception {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    LOG.debug("Verifying test data batch " + batchId);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    Table table = TEST_UTIL.getConnection().getTable(tableName);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    for (int i = 0; i &lt; NUM_ROWS_PER_BATCH; ++i) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      Get get = new Get(getRowKey(batchId, i));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      Result result = table.get(get);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      for (int j = 0; j &lt; NUM_COLS_PER_ROW; ++j) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        Cell kv = result.getColumnLatestCell(CF_BYTES, getQualifier(j));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        if (kv == null) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          continue;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        assertTrue(CellUtil.matchingValue(kv, getValue(batchId, i, j)));<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    table.close();<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>  private void writeSomeNewData() throws Exception {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    writeTestDataBatch(tableName, numBatchesWritten);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    ++numBatchesWritten;<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>  private void verifyAllData() throws Exception {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    for (int i = 0; i &lt; numBatchesWritten; ++i) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      verifyTestDataBatch(tableName, i);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>  private void setEncodingConf(DataBlockEncoding encoding,<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      boolean onlineChange) throws Exception {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    LOG.debug("Setting CF encoding to " + encoding + " (ordinal="<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      + encoding.ordinal() + "), onlineChange=" + onlineChange);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    hcd.setDataBlockEncoding(encoding);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    try (Admin admin = TEST_UTIL.getConnection().getAdmin()) {<a name="line.189"></a>
 <span class="sourceLineNo">190</span>      if (!onlineChange) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        admin.enableTable(tableName);<a name="line.191"></a>
+<span class="sourceLineNo">191</span>        admin.disableTable(tableName);<a name="line.191"></a>
 <span class="sourceLineNo">192</span>      }<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    // This is a unit test, not integration test. So let's<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // wait for regions out of transition. Otherwise, for online<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // encoding change, verification phase may be flaky because<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // regions could be still in transition.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    TEST_UTIL.waitUntilNoRegionsInTransition(TIMEOUT_MS);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>  @Test<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  public void testChangingEncoding() throws Exception {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    prepareTest("ChangingEncoding");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    for (boolean onlineChange : new boolean[]{false, true}) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      for (DataBlockEncoding encoding : ENCODINGS_TO_ITERATE) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        setEncodingConf(encoding, onlineChange);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        writeSomeNewData();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        verifyAllData();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  @Test<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  public void testChangingEncodingWithCompaction() throws Exception {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    prepareTest("ChangingEncodingWithCompaction");<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    for (boolean onlineChange : new boolean[]{false, true}) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      for (DataBlockEncoding encoding : ENCODINGS_TO_ITERATE) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        setEncodingConf(encoding, onlineChange);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        writeSomeNewData();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        verifyAllData();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        compactAndWait();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        verifyAllData();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>  private void compactAndWait() throws IOException, InterruptedException {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.debug("Compacting table " + tableName);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    HRegionServer rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    admin.majorCompact(tableName);<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    // Waiting for the compaction to start, at least .5s.<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    final long maxWaitime = System.currentTimeMillis() + 500;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    boolean cont;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    do {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      cont = rs.compactSplitThread.getCompactionQueueSize() == 0;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      Threads.sleep(1);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    } while (cont &amp;&amp; System.currentTimeMillis() &lt; maxWaitime);<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>    while (rs.compactSplitThread.getCompactionQueueSize() &gt; 0) {<a name="line.241"></a>
+<span class="sourceLineNo">193</span>      admin.modifyColumnFamily(tableName, hcd);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      if (!onlineChange) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        admin.enableTable(tableName);<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>    // This is a unit test, not integration test. So let's<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    // wait for regions out of transition. Otherwise, for online<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    // encoding change, verification phase may be flaky because<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // regions could be still in transition.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    TEST_UTIL.waitUntilNoRegionsInTransition(TIMEOUT_MS);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  public void testChangingEncoding() throws Exception {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    prepareTest("ChangingEncoding");<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    for (boolean onlineChange : new boolean[]{false, true}) {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      for (DataBlockEncoding encoding : ENCODINGS_TO_ITERATE) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        setEncodingConf(encoding, onlineChange);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        writeSomeNewData();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        verifyAllData();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  @Test<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  public void testChangingEncodingWithCompaction() throws Exception {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    prepareTest("ChangingEncodingWithCompaction");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    for (boolean onlineChange : new boolean[]{false, true}) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      for (DataBlockEncoding encoding : ENCODINGS_TO_ITERATE) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        setEncodingConf(encoding, onlineChange);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        writeSomeNewData();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        verifyAllData();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        compactAndWait();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        verifyAllData();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      }<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  private void compactAndWait() throws IOException, InterruptedException {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    LOG.debug("Compacting table " + tableName);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    HRegionServer rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    admin.majorCompact(tableName);<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // Waiting for the compaction to start, at least .5s.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    final long maxWaitime = System.currentTimeMillis() + 500;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    boolean cont;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    do {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      cont = rs.compactSplitThread.getCompactionQueueSize() == 0;<a name="line.241"></a>
 <span class="sourceLineNo">242</span>      Threads.sleep(1);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    LOG.debug("Compaction queue size reached 0, continuing");<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  @Test<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  public void testCrazyRandomChanges() throws Exception {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    prepareTest("RandomChanges");<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Random rand = new Random(2934298742974297L);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    for (int i = 0; i &lt; 10; ++i) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      int encodingOrdinal = rand.nextInt(DataBlockEncoding.values().length);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      DataBlockEncoding encoding = DataBlockEncoding.values()[encodingOrdinal];<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      setEncodingConf(encoding, rand.nextBoolean());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      writeSomeNewData();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      verifyAllData();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>}<a name="line.259"></a>
+<span class="sourceLineNo">243</span>    } while (cont &amp;&amp; System.currentTimeMillis() &lt; maxWaitime);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    while (rs.compactSplitThread.getCompactionQueueSize() &gt; 0) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      Threads.sleep(1);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    LOG.debug("Compaction queue size reached 0, continuing");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  @Test<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public void testCrazyRandomChanges() throws Exception {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    prepareTest("RandomChanges");<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    Random rand = new Random(2934298742974297L);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    for (int i = 0; i &lt; 10; ++i) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      int encodingOrdinal = rand.nextInt(DataBlockEncoding.values().length);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      DataBlockEncoding encoding = DataBlockEncoding.values()[encodingOrdinal];<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      setEncodingConf(encoding, rand.nextBoolean());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      writeSomeNewData();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      verifyAllData();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<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>
 
 
 


[40/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 8b77c1f..2f8b999 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -284,7 +284,7 @@
 <td>3703</td>
 <td>0</td>
 <td>0</td>
-<td>15546</td></tr></table></div>
+<td>15547</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -5467,7 +5467,7 @@
 <td><a href="#org.apache.hadoop.hbase.namespace.TestNamespaceAuditor.java">org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>2</td></tr>
+<td>4</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.net.Address.java">org/apache/hadoop/hbase/net/Address.java</a></td>
 <td>0</td>
@@ -6862,7 +6862,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestEndToEndSplitTransaction.java">org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>4</td></tr>
+<td>1</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestFSErrorsExposed.java">org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.java</a></td>
 <td>0</td>
@@ -7177,7 +7177,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestSplitTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>27</td></tr>
+<td>29</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestStoreFileInfo.java">org/apache/hadoop/hbase/regionserver/TestStoreFileInfo.java</a></td>
 <td>0</td>
@@ -9794,7 +9794,7 @@
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1838</td>
+<td>1837</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>coding</td>
@@ -9853,7 +9853,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>1151</td>
+<td>1155</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -9865,7 +9865,7 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_imports.html#UnusedImports">UnusedImports</a>
 <ul>
 <li>processJavadoc: <tt>&quot;true&quot;</tt></li></ul></td>
-<td>111</td>
+<td>112</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>indentation</td>
@@ -9906,7 +9906,7 @@
 <ul>
 <li>max: <tt>&quot;100&quot;</tt></li>
 <li>ignorePattern: <tt>&quot;^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated&quot;</tt></li></ul></td>
-<td>1523</td>
+<td>1520</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -51131,61 +51131,61 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1195</td></tr>
+<td>1197</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>1199</td></tr>
+<td>1201</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>1208</td></tr>
+<td>1210</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>1289</td></tr>
+<td>1291</td></tr>
 <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 130).</td>
-<td>1341</td></tr>
+<td>1343</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 127).</td>
-<td>1342</td></tr>
+<td>1344</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>1529</td></tr>
+<td>1531</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>1566</td></tr>
+<td>1568</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>1632</td></tr>
+<td>1634</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>1635</td></tr></table></div>
+<td>1637</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.BucketCacheStats.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java</h3>
 <table border="0" class="table table-striped">
@@ -71743,14 +71743,26 @@
 <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.Waiter.ExplainingPredicate.</td>
+<td>51</td></tr>
+<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.RetryCounter.</td>
+<td>86</td></tr>
+<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>84</td></tr>
+<td>87</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 7, expected level should be one of the following: 8, 10.</td>
-<td>523</td></tr></table></div>
+<td>543</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.net.Address.java">org/apache/hadoop/hbase/net/Address.java</h3>
 <table border="0" class="table table-striped">
@@ -80258,37 +80270,37 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1827</td></tr>
+<td>1837</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>2039</td></tr>
+<td>2049</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>2232</td></tr>
+<td>2242</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>2346</td></tr>
+<td>2356</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>2378</td></tr>
+<td>2388</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 102).</td>
-<td>2628</td></tr></table></div>
+<td>2638</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HStoreFile.java">org/apache/hadoop/hbase/regionserver/HStoreFile.java</h3>
 <table border="0" class="table table-striped">
@@ -84011,19 +84023,19 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>469</td></tr>
+<td>475</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>489</td></tr>
+<td>495</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>608</td></tr></table></div>
+<td>614</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileScanner.java">org/apache/hadoop/hbase/regionserver/StoreFileScanner.java</h3>
 <table border="0" class="table table-striped">
@@ -84044,67 +84056,67 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>223</td></tr>
+<td>224</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>251</td></tr>
+<td>252</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>308</td></tr>
+<td>309</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>319</td></tr>
+<td>320</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>320</td></tr>
+<td>321</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>322</td></tr>
+<td>323</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>325</td></tr>
+<td>326</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>344</td></tr>
+<td>345</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>464</td></tr>
+<td>465</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>513</td></tr>
+<td>514</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>521</td></tr></table></div>
+<td>522</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileWriter.java">org/apache/hadoop/hbase/regionserver/StoreFileWriter.java</h3>
 <table border="0" class="table table-striped">
@@ -85622,38 +85634,20 @@
 <th>Line</th></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 123).</td>
-<td>229</td></tr>
-<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 123).</td>
-<td>231</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 102).</td>
-<td>346</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>418</td></tr></table></div>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.AfterClass' import.</td>
+<td>68</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestFSErrorsExposed.java">org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.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>
@@ -85662,25 +85656,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestFailedAppendAndSync.java">org/apache/hadoop/hbase/regionserver/TestFailedAppendAndSync.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>256</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>264</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>
@@ -85689,13 +85683,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestGetClosestAtOrBefore.java">org/apache/hadoop/hbase/regionserver/TestGetClosestAtOrBefore.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>
@@ -85704,79 +85698,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHMobStore.java">org/apache/hadoop/hbase/regionserver/TestHMobStore.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>121</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>139</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>247</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>291</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>337</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>381</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>471</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>472</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>483</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>484</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>
@@ -85785,313 +85779,313 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegion.java">org/apache/hadoop/hbase/regionserver/TestHRegion.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>256</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>291</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>439</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 6, expected level should be 8.</td>
 <td>1122</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>1403</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>'else' construct must use '{}'s.</td>
 <td>1405</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>1422</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>'else' construct must use '{}'s.</td>
 <td>1424</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>1742</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 105).</td>
 <td>1751</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>1756</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 105).</td>
 <td>1762</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 101).</td>
 <td>1769</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>1777</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>1782</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 103).</td>
 <td>1818</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 101).</td>
 <td>1825</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 103).</td>
 <td>1870</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 101).</td>
 <td>1877</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 103).</td>
 <td>2025</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>2101</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 105).</td>
 <td>2117</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 101).</td>
 <td>2128</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>2873</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>3591</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>3663</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>3664</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>'try' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>3831</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class PutThread should be declared as final.</td>
 <td>3842</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>4018</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>4086</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>
 <td>Empty statement.</td>
 <td>4087</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>4171</td></tr>
-<tr class="a">
+<tr class="b">
 <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>4172</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>4219</td></tr>
-<tr class="a">
+<tr class="b">
 <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>4220</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>4257</td></tr>
-<tr class="a">
+<tr class="b">
 <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>4266</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>4267</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>4285</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>4318</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>4434</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>4521</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>4581</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>'for' construct must use '{}'s.</td>
 <td>4976</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 165 lines (max allowed is 150).</td>
 <td>5441</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>5932</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 4, expected level should be one of the following: 6, 8.</td>
 <td>5947</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 101).</td>
 <td>5975</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>6094</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>
@@ -86100,37 +86094,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.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>280</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>286</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>292</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>325</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>
@@ -86139,19 +86133,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionInfo.java">org/apache/hadoop/hbase/regionserver/TestHRegionInfo.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>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>92</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>
@@ -86160,19 +86154,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestHRegionOnCluster.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>154</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>
@@ -86181,103 +86175,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionReplayEvents.java">org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.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>'for' construct must use '{}'s.</td>
 <td>301</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>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>360</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>362</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>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>462</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>568</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>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>658</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>770</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>772</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>869</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>873</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>1029</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>1146</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>1447</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 113).</td>
 <td>1571</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 101).</td>
 <td>1629</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>
@@ -86286,55 +86280,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoad.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.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>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>192</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>221</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 107).</td>
 <td>245</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>293</td></tr>
-<tr class="a">
+<tr class="b">
 <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>300</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>319</td></tr>
-<tr class="a">
+<tr class="b">
 <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>320</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>
@@ -86343,37 +86337,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoadWithOldClient.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoadWithOldClient.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>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>79</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>106</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 14, expected level should be one of the following: 10, 12.</td>
 <td>111</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 14, expected level should be one of the following: 10, 12.</td>
 <td>114</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>
@@ -86382,247 +86376,247 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHStore.java">org/apache/hadoop/hbase/regionserver/TestHStore.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>163</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>239</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>468</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>505</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>'ColumnFamilyDescriptorBuilder' has incorrect indentation level 4, expected level should be 6.</td>
 <td>536</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>560</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>599</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 4, expected level should be 6.</td>
 <td>747</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 4, expected level should be 6.</td>
 <td>759</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>788</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>789</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>790</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>791</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>808</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 102).</td>
 <td>951</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>1465</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>1466</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 23 should have line break after.</td>
 <td>1830</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 30 should have line break after.</td>
 <td>1833</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 39 should have line break after.</td>
 <td>1836</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 35 should have line break after.</td>
 <td>1839</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 31 should have line break after.</td>
 <td>1842</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 35 should have line break after.</td>
 <td>1845</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 37 should have line break after.</td>
 <td>1854</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 49 should have line break after.</td>
 <td>1857</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 54 should have line break after.</td>
 <td>1860</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 65 should have line break after.</td>
 <td>1863</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 47 should have line break after.</td>
 <td>1866</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 47 should have line break after.</td>
 <td>1869</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 25 should have line break after.</td>
 <td>1872</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>1875</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 40 should have line break after.</td>
 <td>1878</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 43 should have line break after.</td>
 <td>1881</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 32 should have line break after.</td>
 <td>1884</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 34 should have line break after.</td>
 <td>1887</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 38 should have line break after.</td>
 <td>1890</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 43 should have line break after.</td>
 <td>1893</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 52 should have line break after.</td>
 <td>1896</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 102).</td>
 <td>1899</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -86631,154 +86625,154 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHStoreFile.java">org/apache/hadoop/hbase/regionserver/TestHStoreFile.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.HColumnDescriptor.</td>
-<td>42</td></tr>
-<tr class="b">
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.After' import.</td>
+<td>73</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>114</td></tr>
-<tr class="a">
+<td>115</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>149</td></tr>
-<tr class="b">
+<td>150</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>166</td></tr>
-<tr class="a">
+<td>167</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 151 lines (max allowed is 150).</td>
-<td>350</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>543</td></tr>
+<td>380</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>545</td></tr>
+<td>573</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>623</td></tr>
+<td>575</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>626</td></tr>
+<td>653</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>745</td></tr>
+<td>656</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>747</td></tr>
+<td>775</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>812</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>777</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>813</td></tr>
+<td>842</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>814</td></tr>
+<td>843</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>815</td></tr>
+<td>844</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>845</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 7 should be on the previous line.</td>
-<td>826</td></tr>
-<tr class="a">
+<td>856</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>835</td></tr>
-<tr class="b">
+<td>865</td></tr>
+<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>930</td></tr>
-<tr class="a">
+<td>960</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
-<td>930</td></tr>
-<tr class="b">
+<td>960</td></tr>
+<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>951</td></tr>
-<tr class="a">
+<td>981</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
-<td>951</td></tr>
-<tr class="b">
+<td>981</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>1038</td></tr></table></div>
+<td>1068</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestJoinedScanners.java">org/apache/hadoop/hbase/regionserver/TestJoinedScanners.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>
@@ -86787,37 +86781,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestKeepDeletes.java">org/apache/hadoop/hbase/regionserver/TestKeepDeletes.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>'while' construct must use '{}'s.</td>
 <td>282</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>
 <td>Empty statement.</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>823</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>902</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>
@@ -86826,31 +86820,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestKeyValueHeap.java">org/apache/hadoop/hbase/regionserver/TestKeyValueHeap.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>'while' construct must use '{}'s.</td>
 <td>150</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>
 <td>Empty statement.</td>
 <td>150</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>182</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>
@@ -86859,13 +86853,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestKeyValueScanFixture.java">org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.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>misc</td>
 <td>ArrayTypeStyle</td>
@@ -86874,43 +86868,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMajorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMajorCompaction.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>157</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>221</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>221</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>442</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>497</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>
@@ -86919,19 +86913,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMasterAddressTracker.java">org/apache/hadoop/hbase/regionserver/TestMasterAddressTracker.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.apache.hadoop.hbase.*.</td>
 <td>26</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>
@@ -86940,19 +86934,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMemStoreLAB.java">org/apache/hadoop/hbase/regionserver/TestMemStoreLAB.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>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</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>
@@ -86961,13 +86955,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMemstoreLABWithoutPool.java">org/apache/hadoop/hbase/regionserver/TestMemstoreLABWithoutPool.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>
@@ -86976,25 +86970,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMetricsRegion.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegion.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>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>100</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>103</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>
@@ -87003,19 +86997,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.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 preceded with whitespace.</td>
 <td>123</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>
@@ -87024,25 +87018,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMetricsTableAggregate.java">org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.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 102).</td>
 <td>50</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>52</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>
@@ -87051,13 +87045,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMinorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMinorCompaction.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>
@@ -87066,37 +87060,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMobStoreScanner.java">org/apache/hadoop/hbase/regionserver/TestMobStoreScanner.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>
 <td>'method def' child has incorrect indentation level 10, expected level should be 4.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>FileTabCharacter</td>
 <td>File contains tab characters (this is the first instance).</td>
 <td>145</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 10, expected level should be 4.</td>
 <td>146</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 10, expected level should be 4.</td>
 <td>154</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>
@@ -87105,61 +87099,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiColumnScanner.java">org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.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>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 56.</td>
 <td>101</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>'for' construct must use '{}'s.</td>
 <td>126</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>'for' construct must use '{}'s.</td>
 <td>174</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>'for' construct must use '{}'s.</td>
 <td>175</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>'for' construct must use '{}'s.</td>
 <td>182</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>'for' construct must use '{}'s.</td>
 <td>185</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>193</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>'for' construct must use '{}'s.</td>
 <td>215</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>
@@ -87168,67 +87162,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiLogThreshold.java">org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.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>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>98</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>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>99</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>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>100</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>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>101</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>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>102</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>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>103</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 106).</td>
 <td>126</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>132</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 106).</td>
 <td>138</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>
@@ -87237,13 +87231,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/TestMultiVersionConcurrencyControl.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>
@@ -87252,19 +87246,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestParallelPut.java">org/apache/hadoop/hbase/regionserver/TestParallelPut.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>100</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>
@@ -87273,31 +87267,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestPerColumnFamilyFlush.java">org/apache/hadoop/hbase/regionserver/TestPerColumnFamilyFlush.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>446</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 106).</td>
 <td>499</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 106).</td>
 <td>500</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>
@@ -87306,31 +87300,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestPriorityRpc.java">org/apache/hadoop/hbase/regionserver/TestPriorityRpc.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>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>144</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>'(' is preceded with whitespace.</td>
 <td>149</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 107).</td>
 <td>161</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>
@@ -87339,13 +87333,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestQosFunction.java">org/apache/hadoop/hbase/regionserver/TestQosFunction.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>AvoidStarImport</td>
@@ -87354,49 +87348,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRSKilledWhenInitializing.java">org/apache/hadoop/hbase/regionserver/TestRSKilledWhenInitializing.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>85</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>89</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 105).</td>
 <td>133</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>137</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>180</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 4, expected level should be 6.</td>
 <td>203</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>
@@ -87405,67 +87399,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRecoveredEdits.java">org/apache/hadoop/hbase/regionserver/TestRecoveredEdits.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>78</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>161</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>162</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>163</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>164</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>166</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>170</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>189</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>
@@ -87474,43 +87468,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionIncrement.java">org/apache/hadoop/hbase/regionserver/TestRegionIncrement.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>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>100</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>176</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>196</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>'for' construct must use '{}'s.</td>
 <td>199</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>229</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>
@@ -87519,13 +87513,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionInfoBuilder.java">org/apache/hadoop/hbase/regionserver/TestRegionInfoBuilder.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>
@@ -87534,13 +87528,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionMergeTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.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>
@@ -87549,25 +87543,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionOpen.java">org/apache/hadoop/hbase/regionserver/TestRegionOpen.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.junit.Assert.assertTrue.</td>
 <td>21</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>118</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>
@@ -87576,25 +87570,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionReplicaFailover.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicaFailover.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>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</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, 52, 53.</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>
@@ -87603,49 +87597,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionReplicas.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicas.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>150</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 preceded with whitespace.</td>
 <td>150</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 112).</td>
 <td>320</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>352</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 116).</td>
 <td>392</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 116).</td>
 <td>398</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>
@@ -87654,19 +87648,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerAbort.java">org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.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>56</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>
@@ -87675,25 +87669,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerHostname.java">org/apache/hadoop/hbase/regionserver/TestRegionServerHostname.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>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>144</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 111).</td>
 <td>151</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>
@@ -87702,37 +87696,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.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>161</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>164</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>181</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 lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>566</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>
@@ -87741,37 +87735,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerNoMaster.java">org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.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>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>133</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>134</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>290</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>295</td></tr>
-<tr class="b">
+<tr class="a">
 

<TRUNCATED>

[11/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
index 740e531..7aea77c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionChecker.html
@@ -32,411 +32,519 @@
 <span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Random;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Set;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.TreeSet;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.stream.Collectors;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.commons.io.IOUtils;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.ChoreService;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HConstants;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.ScheduledChore;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.Stoppable;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.TableName;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Get;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Put;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Result;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Table;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.PairOfSameType;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.util.StoppableImplementation;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.AfterClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.BeforeClass;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.ClassRule;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Rule;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.rules.TestName;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.slf4j.Logger;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.slf4j.LoggerFactory;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterators;<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>@Category(LargeTests.class)<a name="line.70"></a>
-<span class="sourceLineNo">071</span>public class TestEndToEndSplitTransaction {<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  @ClassRule<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      HBaseClassTestRule.forClass(TestEndToEndSplitTransaction.class);<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(TestEndToEndSplitTransaction.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final Configuration CONF = TEST_UTIL.getConfiguration();<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  @Rule<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public TestName name = new TestName();<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  @BeforeClass<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public static void beforeAllTests() throws Exception {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    TEST_UTIL.startMiniCluster();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
+<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Random;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Set;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.TreeSet;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.stream.Collectors;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.commons.io.IOUtils;<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.hbase.ChoreService;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HConstants;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.ScheduledChore;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.Stoppable;<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.client.Admin;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Get;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Put;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Result;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Table;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<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.PairOfSameType;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.util.StoppableImplementation;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterators;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.junit.AfterClass;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.Assert;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.BeforeClass;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.junit.ClassRule;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.Rule;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Test;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.experimental.categories.Category;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.rules.TestName;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.slf4j.Logger;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.slf4j.LoggerFactory;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>@Category(LargeTests.class)<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class TestEndToEndSplitTransaction {<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  @ClassRule<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      HBaseClassTestRule.forClass(TestEndToEndSplitTransaction.class);<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(TestEndToEndSplitTransaction.class);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final Configuration CONF = TEST_UTIL.getConfiguration();<a name="line.88"></a>
 <span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  @AfterClass<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public static void afterAllTests() throws Exception {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * Tests that the client sees meta table changes as atomic during splits<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @Test<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public void testFromClientSideWhileSplitting() throws Throwable {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    LOG.info("Starting testFromClientSideWhileSplitting");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    final byte[] FAMILY = Bytes.toBytes("family");<a name="line.102"></a>
+<span class="sourceLineNo">090</span>  @Rule<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public TestName name = new TestName();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @BeforeClass<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static void beforeAllTests() throws Exception {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    TEST_UTIL.startMiniCluster();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  @AfterClass<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static void afterAllTests() throws Exception {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
 <span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>    //SplitTransaction will update the meta table by offlining the parent region, and adding info<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    //for daughters.<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    Table table = TEST_UTIL.createTable(tableName, FAMILY);<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>    Stoppable stopper = new StoppableImplementation();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    RegionSplitter regionSplitter = new RegionSplitter(table);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    RegionChecker regionChecker = new RegionChecker(CONF, stopper, tableName);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    final ChoreService choreService = new ChoreService("TEST_SERVER");<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>    choreService.scheduleChore(regionChecker);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    regionSplitter.start();<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    //wait until the splitter is finished<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    regionSplitter.join();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    stopper.stop(null);<a name="line.118"></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>   * This is the test for : HBASE-20940 This test will split the region and try to open an reference<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * over store file. Once store file has any reference, it makes sure that region can't be split<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * @throws Exception<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public void testCanSplitJustAfterASplit() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    LOG.info("Starting testCanSplitJustAfterASplit");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    byte[] fam = Bytes.toBytes("cf_split");<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>    TableName tableName = TableName.valueOf("CanSplitTable");<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    Table source = TEST_UTIL.getConnection().getTable(tableName);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    Map&lt;String, StoreFileReader&gt; scanner = Maps.newHashMap();<a name="line.118"></a>
 <span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (regionChecker.ex != null) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      throw new AssertionError("regionChecker", regionChecker.ex);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">120</span>    try {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      TableDescriptor htd = TableDescriptorBuilder.newBuilder(tableName)<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          .setColumnFamily(ColumnFamilyDescriptorBuilder.of(fam)).build();<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (regionSplitter.ex != null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      throw new AssertionError("regionSplitter", regionSplitter.ex);<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>    //one final check<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    regionChecker.verify();<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>  static class RegionSplitter extends Thread {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    final Connection connection;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    Throwable ex;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    Table table;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TableName tableName;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    byte[] family;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Admin admin;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    HRegionServer rs;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    RegionSplitter(Table table) throws IOException {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      this.table = table;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      this.tableName = table.getName();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      this.family = table.getTableDescriptor().getFamiliesKeys().iterator().next();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      admin = TEST_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      connection = TEST_UTIL.getConnection();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void run() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      try {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        Random random = new Random();<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        for (int i= 0; i&lt; 5; i++) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          List&lt;RegionInfo&gt; regions =<a name="line.155"></a>
-<span class="sourceLineNo">156</span>              MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          if (regions.isEmpty()) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>            continue;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>          }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>          int regionIndex = random.nextInt(regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>          //pick a random region and split it into two<a name="line.162"></a>
-<span class="sourceLineNo">163</span>          RegionInfo region = Iterators.get(regions.iterator(), regionIndex);<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>          //pick the mid split point<a name="line.165"></a>
-<span class="sourceLineNo">166</span>          int start = 0, end = Integer.MAX_VALUE;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          if (region.getStartKey().length &gt; 0) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>            start = Bytes.toInt(region.getStartKey());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          if (region.getEndKey().length &gt; 0) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>            end = Bytes.toInt(region.getEndKey());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          int mid = start + ((end - start) / 2);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          byte[] splitPoint = Bytes.toBytes(mid);<a name="line.174"></a>
+<span class="sourceLineNo">124</span>      admin.createTable(htd);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      TEST_UTIL.loadTable(source, fam);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      List&lt;HRegion&gt; regions = TEST_UTIL.getHBaseCluster().getRegions(tableName);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      regions.get(0).forceSplit(null);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      admin.split(tableName);<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>      while (regions.size() &lt;= 1) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        regions = TEST_UTIL.getHBaseCluster().getRegions(tableName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        regions.stream()<a name="line.132"></a>
+<span class="sourceLineNo">133</span>            .forEach(r -&gt; r.getStores().get(0).getStorefiles().stream()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                .filter(<a name="line.134"></a>
+<span class="sourceLineNo">135</span>                  s -&gt; s.isReference() &amp;&amp; !scanner.containsKey(r.getRegionInfo().getEncodedName()))<a name="line.135"></a>
+<span class="sourceLineNo">136</span>                .forEach(sf -&gt; {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>                  StoreFileReader reader = ((HStoreFile) sf).getReader();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>                  reader.getStoreFileScanner(true, false, false, 0, 0, false);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>                  scanner.put(r.getRegionInfo().getEncodedName(), reader);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>                  LOG.info("Got reference to file = " + sf.getPath() + ",for region = "<a name="line.140"></a>
+<span class="sourceLineNo">141</span>                      + r.getRegionInfo().getEncodedName());<a name="line.141"></a>
+<span class="sourceLineNo">142</span>                }));<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>      Assert.assertTrue("Regions did not split properly", regions.size() &gt; 1);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      Assert.assertTrue("Could not get reference any of the store file", scanner.size() &gt; 1);<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>      RetryCounter retrier = new RetryCounter(30, 1, TimeUnit.SECONDS);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      while (CompactionState.NONE != admin.getCompactionState(tableName) &amp;&amp; retrier.shouldRetry()) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        retrier.sleepUntilNextRetry();<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>      Assert.assertEquals("Compaction did not complete in 30 secs", CompactionState.NONE,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        admin.getCompactionState(tableName));<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>      regions.stream()<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          .filter(region -&gt; scanner.containsKey(region.getRegionInfo().getEncodedName()))<a name="line.157"></a>
+<span class="sourceLineNo">158</span>          .forEach(r -&gt; Assert.assertTrue("Contains an open file reference which can be split",<a name="line.158"></a>
+<span class="sourceLineNo">159</span>            !r.getStores().get(0).canSplit()));<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    } finally {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      scanner.values().stream().forEach(s -&gt; {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        try {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          s.close(true);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        } catch (IOException ioe) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          LOG.error("Failed while closing store file", ioe);<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>      scanner.clear();<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      if (source != null) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        source.close();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      TEST_UTIL.deleteTableIfAny(tableName);<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><a name="line.175"></a>
-<span class="sourceLineNo">176</span>          //put some rows to the regions<a name="line.176"></a>
-<span class="sourceLineNo">177</span>          addData(start);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>          addData(mid);<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>          flushAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          compactAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>          log("Initiating region split for:" + region.getRegionNameAsString());<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>            admin.splitRegion(region.getRegionName(), splitPoint);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>            //wait until the split is complete<a name="line.186"></a>
-<span class="sourceLineNo">187</span>            blockUntilRegionSplit(CONF, 50000, region.getRegionName(), true);<a name="line.187"></a>
+<span class="sourceLineNo">176</span>  /**<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * Tests that the client sees meta table changes as atomic during splits<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Test<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void testFromClientSideWhileSplitting() throws Throwable {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    LOG.info("Starting testFromClientSideWhileSplitting");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    final byte[] FAMILY = Bytes.toBytes("family");<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>    //SplitTransaction will update the meta table by offlining the parent region, and adding info<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    //for daughters.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    Table table = TEST_UTIL.createTable(tableName, FAMILY);<a name="line.187"></a>
 <span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>          } catch (NotServingRegionException ex) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>            //ignore<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>      } catch (Throwable ex) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        this.ex = ex;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>    void addData(int start) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      for (int i=start; i&lt; start + 100; i++) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        put.addColumn(family, family, Bytes.toBytes(i));<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        puts.add(put);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      table.put(puts);<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">189</span>    Stoppable stopper = new StoppableImplementation();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    RegionSplitter regionSplitter = new RegionSplitter(table);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    RegionChecker regionChecker = new RegionChecker(CONF, stopper, tableName);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    final ChoreService choreService = new ChoreService("TEST_SERVER");<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    choreService.scheduleChore(regionChecker);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    regionSplitter.start();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    //wait until the splitter is finished<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    regionSplitter.join();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    stopper.stop(null);<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (regionChecker.ex != null) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      throw new AssertionError("regionChecker", regionChecker.ex);<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>    if (regionSplitter.ex != null) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      throw new AssertionError("regionSplitter", regionSplitter.ex);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
 <span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Checks regions using MetaTableAccessor and HTable methods<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  static class RegionChecker extends ScheduledChore {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    Connection connection;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Configuration conf;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    TableName tableName;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    Throwable ex;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    RegionChecker(Configuration conf, Stoppable stopper, TableName tableName) throws IOException {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      super("RegionChecker", stopper, 10);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.conf = conf;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      this.tableName = tableName;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>      this.connection = ConnectionFactory.createConnection(conf);<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>    /** verify region boundaries obtained from MetaScanner */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    void verifyRegionsUsingMetaTableAccessor() throws Exception {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      List&lt;RegionInfo&gt; regionList = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      verifyTableRegions(regionList.stream().collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      regionList = MetaTableAccessor.getAllRegions(connection, true);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      verifyTableRegions(regionList.stream().collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<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>    /** verify region boundaries obtained from HTable.getStartEndKeys() */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    void verifyRegionsUsingHTable() throws IOException {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      Table table = null;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        //HTable.getStartEndKeys()<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        table = connection.getTable(tableName);<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>        try(RegionLocator rl = connection.getRegionLocator(tableName)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          Pair&lt;byte[][], byte[][]&gt; keys = rl.getStartEndKeys();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          verifyStartEndKeys(keys);<a name="line.243"></a>
+<span class="sourceLineNo">209</span>    //one final check<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    regionChecker.verify();<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>  static class RegionSplitter extends Thread {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    final Connection connection;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    Throwable ex;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    Table table;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    TableName tableName;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    byte[] family;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    Admin admin;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    HRegionServer rs;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    RegionSplitter(Table table) throws IOException {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      this.table = table;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      this.tableName = table.getName();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      this.family = table.getTableDescriptor().getFamiliesKeys().iterator().next();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      admin = TEST_UTIL.getAdmin();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      rs = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      connection = TEST_UTIL.getConnection();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    public void run() {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        Random random = new Random();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        for (int i = 0; i &lt; 5; i++) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>          List&lt;RegionInfo&gt; regions = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>          if (regions.isEmpty()) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            continue;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>          }<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          int regionIndex = random.nextInt(regions.size());<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>          // pick a random region and split it into two<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          RegionInfo region = Iterators.get(regions.iterator(), regionIndex);<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>          Set&lt;RegionInfo&gt; regions = new TreeSet&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          for (HRegionLocation loc : rl.getAllRegionLocations()) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            regions.add(loc.getRegionInfo());<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          verifyTableRegions(regions);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>      } finally {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        IOUtils.closeQuietly(table);<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>    void verify() throws Exception {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      verifyRegionsUsingMetaTableAccessor();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      verifyRegionsUsingHTable();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    void verifyTableRegions(Set&lt;RegionInfo&gt; regions) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      log("Verifying " + regions.size() + " regions: " + regions);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>      byte[][] startKeys = new byte[regions.size()][];<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      byte[][] endKeys = new byte[regions.size()][];<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>      int i=0;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (RegionInfo region : regions) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        startKeys[i] = region.getStartKey();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        endKeys[i] = region.getEndKey();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        i++;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>      Pair&lt;byte[][], byte[][]&gt; keys = new Pair&lt;&gt;(startKeys, endKeys);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      verifyStartEndKeys(keys);<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>    void verifyStartEndKeys(Pair&lt;byte[][], byte[][]&gt; keys) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      byte[][] startKeys = keys.getFirst();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      byte[][] endKeys = keys.getSecond();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      assertEquals(startKeys.length, endKeys.length);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      assertTrue("Found 0 regions for the table", startKeys.length &gt; 0);<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>      assertArrayEquals("Start key for the first region is not byte[0]",<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          HConstants.EMPTY_START_ROW, startKeys[0]);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      byte[] prevEndKey = HConstants.EMPTY_START_ROW;<a name="line.287"></a>
+<span class="sourceLineNo">245</span>          // pick the mid split point<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          int start = 0, end = Integer.MAX_VALUE;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          if (region.getStartKey().length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>            start = Bytes.toInt(region.getStartKey());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          if (region.getEndKey().length &gt; 0) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>            end = Bytes.toInt(region.getEndKey());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          }<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          int mid = start + ((end - start) / 2);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          byte[] splitPoint = Bytes.toBytes(mid);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>          // put some rows to the regions<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          addData(start);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          addData(mid);<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>          flushAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          compactAndBlockUntilDone(admin, rs, region.getRegionName());<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>          log("Initiating region split for:" + region.getRegionNameAsString());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            admin.splitRegion(region.getRegionName(), splitPoint);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            // wait until the split is complete<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            blockUntilRegionSplit(CONF, 50000, region.getRegionName(), true);<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>          } catch (NotServingRegionException ex) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>            // ignore<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      } catch (Throwable ex) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        this.ex = ex;<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><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    void addData(int start) throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      for (int i=start; i&lt; start + 100; i++) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        put.addColumn(family, family, Bytes.toBytes(i));<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        puts.add(put);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      table.put(puts);<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>      // ensure that we do not have any gaps<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i=0; i&lt;startKeys.length; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        assertArrayEquals(<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            "Hole in hbase:meta is detected. prevEndKey=" + Bytes.toStringBinary(prevEndKey)<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                + " ,regionStartKey=" + Bytes.toStringBinary(startKeys[i]), prevEndKey,<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            startKeys[i]);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        prevEndKey = endKeys[i];<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      assertArrayEquals("End key for the last region is not byte[0]", HConstants.EMPTY_END_ROW,<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          endKeys[endKeys.length - 1]);<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>    @Override<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    protected void chore() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        verify();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      } catch (Throwable ex) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        this.ex = ex;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        getStopper().stop("caught exception");<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><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public static void log(String msg) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    LOG.info(msg);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Checks regions using MetaTableAccessor and HTable methods<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  static class RegionChecker extends ScheduledChore {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Connection connection;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    Configuration conf;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    TableName tableName;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    Throwable ex;<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    RegionChecker(Configuration conf, Stoppable stopper, TableName tableName) throws IOException {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      super("RegionChecker", stopper, 10);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      this.conf = conf;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      this.tableName = tableName;<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      this.connection = ConnectionFactory.createConnection(conf);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    /** verify region boundaries obtained from MetaScanner */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    void verifyRegionsUsingMetaTableAccessor() throws Exception {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      List&lt;RegionInfo&gt; regionList = MetaTableAccessor.getTableRegions(connection, tableName, true);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      verifyTableRegions(regionList.stream()<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          .collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      regionList = MetaTableAccessor.getAllRegions(connection, true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      verifyTableRegions(regionList.stream()<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          .collect(Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(RegionInfo.COMPARATOR))));<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
 <span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>  /* some utility methods for split tests */<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public static void flushAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      throws IOException, InterruptedException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    log("flushing region: " + Bytes.toStringBinary(regionName));<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    admin.flushRegion(regionName);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    log("blocking until flush is complete: " + Bytes.toStringBinary(regionName));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    Threads.sleepWithoutInterrupt(500);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    while (rs.getOnlineRegion(regionName).getMemStoreDataSize() &gt; 0) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      Threads.sleep(50);<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>  public static void compactAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      throws IOException, InterruptedException {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    log("Compacting region: " + Bytes.toStringBinary(regionName));<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    admin.majorCompactRegion(regionName);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    log("blocking until compaction is complete: " + Bytes.toStringBinary(regionName));<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    Threads.sleepWithoutInterrupt(500);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    outer: for (;;) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      for (Store store : rs.getOnlineRegion(regionName).getStores()) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        if (store.getStorefilesCount() &gt; 1) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          Threads.sleep(50);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          continue outer;<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>      break;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  /** Blocks until the region split is complete in hbase:meta and region server opens the daughters */<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public static void blockUntilRegionSplit(Configuration conf, long timeout,<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      final byte[] regionName, boolean waitForDaughters)<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      throws IOException, InterruptedException {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    long start = System.currentTimeMillis();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    log("blocking until region is split:" +  Bytes.toStringBinary(regionName));<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    RegionInfo daughterA = null, daughterB = null;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      Result result = null;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      RegionInfo region = null;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      while ((System.currentTimeMillis() - start) &lt; timeout) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        result = metaTable.get(new Get(regionName));<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (result == null) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          break;<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>        region = MetaTableAccessor.getRegionInfo(result);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        if (region.isSplitParent()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          log("found parent region: " + region.toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          PairOfSameType&lt;RegionInfo&gt; pair = MetaTableAccessor.getDaughterRegions(result);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          daughterA = pair.getFirst();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          daughterB = pair.getSecond();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          break;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        Threads.sleep(100);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      if (daughterA == null || daughterB == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        throw new IOException("Failed to get daughters, daughterA=" + daughterA + ", daughterB=" +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          daughterB + ", timeout=" + timeout + ", result=" + result + ", regionName=" +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          Bytes.toString(regionName) + ", region=" + region);<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>      //if we are here, this means the region split is complete or timed out<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      if (waitForDaughters) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        long rem = timeout - (System.currentTimeMillis() - start);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        blockUntilRegionIsInMeta(conn, rem, daughterA);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        blockUntilRegionIsInMeta(conn, rem, daughterB);<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        blockUntilRegionIsOpened(conf, rem, daughterA);<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        blockUntilRegionIsOpened(conf, rem, daughterB);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>  public static void blockUntilRegionIsInMeta(Connection conn, long timeout, RegionInfo hri)<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      throws IOException, InterruptedException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    log("blocking until region is in META: " + hri.getRegionNameAsString());<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    long start = System.currentTimeMillis();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      HRegionLocation loc = MetaTableAccessor.getRegionLocation(conn, hri);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      if (loc != null &amp;&amp; !loc.getRegionInfo().isOffline()) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        log("found region in META: " + hri.getRegionNameAsString());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        break;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      Threads.sleep(10);<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>  public static void blockUntilRegionIsOpened(Configuration conf, long timeout, RegionInfo hri)<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      throws IOException, InterruptedException {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    log("blocking until region is opened for reading:" + hri.getRegionNameAsString());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    long start = System.currentTimeMillis();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        Table table = conn.getTable(hri.getTable())) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      byte[] row = hri.getStartKey();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // Check for null/empty row. If we find one, use a key that is likely to be in first region.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (row == null || row.length &lt;= 0) row = new byte[] { '0' };<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      Get get = new Get(row);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          table.get(get);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          break;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        } catch (IOException ex) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          // wait some more<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        Threads.sleep(10);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>}<a name="line.431"></a>
+<span class="sourceLineNo">316</span>    /** verify region boundaries obtained from HTable.getStartEndKeys() */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    void verifyRegionsUsingHTable() throws IOException {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      Table table = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      try {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        //HTable.getStartEndKeys()<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        table = connection.getTable(tableName);<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>        try(RegionLocator rl = connection.getRegionLocator(tableName)) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          Pair&lt;byte[][], byte[][]&gt; keys = rl.getStartEndKeys();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          verifyStartEndKeys(keys);<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>          Set&lt;RegionInfo&gt; regions = new TreeSet&lt;&gt;(RegionInfo.COMPARATOR);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          for (HRegionLocation loc : rl.getAllRegionLocations()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            regions.add(loc.getRegionInfo());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          verifyTableRegions(regions);<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>      } finally {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        IOUtils.closeQuietly(table);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>    void verify() throws Exception {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      verifyRegionsUsingMetaTableAccessor();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      verifyRegionsUsingHTable();<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>    void verifyTableRegions(Set&lt;RegionInfo&gt; regions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      log("Verifying " + regions.size() + " regions: " + regions);<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>      byte[][] startKeys = new byte[regions.size()][];<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      byte[][] endKeys = new byte[regions.size()][];<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>      int i=0;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      for (RegionInfo region : regions) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        startKeys[i] = region.getStartKey();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        endKeys[i] = region.getEndKey();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        i++;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>      Pair&lt;byte[][], byte[][]&gt; keys = new Pair&lt;&gt;(startKeys, endKeys);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      verifyStartEndKeys(keys);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>    void verifyStartEndKeys(Pair&lt;byte[][], byte[][]&gt; keys) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      byte[][] startKeys = keys.getFirst();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      byte[][] endKeys = keys.getSecond();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      assertEquals(startKeys.length, endKeys.length);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      assertTrue("Found 0 regions for the table", startKeys.length &gt; 0);<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertArrayEquals("Start key for the first region is not byte[0]",<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          HConstants.EMPTY_START_ROW, startKeys[0]);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] prevEndKey = HConstants.EMPTY_START_ROW;<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>      // ensure that we do not have any gaps<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      for (int i=0; i&lt;startKeys.length; i++) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        assertArrayEquals(<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            "Hole in hbase:meta is detected. prevEndKey=" + Bytes.toStringBinary(prevEndKey)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                + " ,regionStartKey=" + Bytes.toStringBinary(startKeys[i]), prevEndKey,<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            startKeys[i]);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        prevEndKey = endKeys[i];<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      assertArrayEquals("End key for the last region is not byte[0]", HConstants.EMPTY_END_ROW,<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          endKeys[endKeys.length - 1]);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    }<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>    @Override<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    protected void chore() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      try {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        verify();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      } catch (Throwable ex) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        this.ex = ex;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        getStopper().stop("caught exception");<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  public static void log(String msg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    LOG.info(msg);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>  /* some utility methods for split tests */<a name="line.398"></a>
+<span class="sourceLineNo">399</span><a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public static void flushAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      throws IOException, InterruptedException {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    log("flushing region: " + Bytes.toStringBinary(regionName));<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    admin.flushRegion(regionName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    log("blocking until flush is complete: " + Bytes.toStringBinary(regionName));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    Threads.sleepWithoutInterrupt(500);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    while (rs.getOnlineRegion(regionName).getMemStoreDataSize() &gt; 0) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      Threads.sleep(50);<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>  public static void compactAndBlockUntilDone(Admin admin, HRegionServer rs, byte[] regionName)<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      throws IOException, InterruptedException {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    log("Compacting region: " + Bytes.toStringBinary(regionName));<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    admin.majorCompactRegion(regionName);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    log("blocking until compaction is complete: " + Bytes.toStringBinary(regionName));<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    Threads.sleepWithoutInterrupt(500);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    outer: for (;;) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      for (Store store : rs.getOnlineRegion(regionName).getStores()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        if (store.getStorefilesCount() &gt; 1) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          Threads.sleep(50);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          continue outer;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      break;<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><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  /**<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * Blocks until the region split is complete in hbase:meta and region server opens the daughters<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   */<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  public static void blockUntilRegionSplit(Configuration conf, long timeout,<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      final byte[] regionName, boolean waitForDaughters)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      throws IOException, InterruptedException {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    long start = System.currentTimeMillis();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    log("blocking until region is split:" +  Bytes.toStringBinary(regionName));<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    RegionInfo daughterA = null, daughterB = null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Result result = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      RegionInfo region = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      while ((System.currentTimeMillis() - start) &lt; timeout) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        result = metaTable.get(new Get(regionName));<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        if (result == null) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          break;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>        region = MetaTableAccessor.getRegionInfo(result);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        if (region.isSplitParent()) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>          log("found parent region: " + region.toString());<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          PairOfSameType&lt;RegionInfo&gt; pair = MetaTableAccessor.getDaughterRegions(result);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          daughterA = pair.getFirst();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          daughterB = pair.getSecond();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          break;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        Threads.sleep(100);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      if (daughterA == null || daughterB == null) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        throw new IOException("Failed to get daughters, daughterA=" + daughterA + ", daughterB=" +<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          daughterB + ", timeout=" + timeout + ", result=" + result + ", regionName=" +<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          Bytes.toString(regionName) + ", region=" + region);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>      //if we are here, this means the region split is complete or timed out<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      if (waitForDaughters) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        long rem = timeout - (System.currentTimeMillis() - start);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        blockUntilRegionIsInMeta(conn, rem, daughterA);<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        blockUntilRegionIsInMeta(conn, rem, daughterB);<a name="line.469"></a>
+<span class="sourceLineNo">470</span><a name="line.470"></a>
+<span class="sourceLineNo">471</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        blockUntilRegionIsOpened(conf, rem, daughterA);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>        rem = timeout - (System.currentTimeMillis() - start);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        blockUntilRegionIsOpened(conf, rem, daughterB);<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>        // Compacting the new region to make sure references can be cleaned up<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        compactAndBlockUntilDone(TEST_UTIL.getAdmin(),<a name="line.478"></a>
+<span class="sourceLineNo">479</span>          TEST_UTIL.getMiniHBaseCluster().getRegionServer(0), daughterA.getRegionName());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>        compactAndBlockUntilDone(TEST_UTIL.getAdmin(),<a name="line.480"></a>
+<span class="sourceLineNo">481</span>          TEST_UTIL.getMiniHBaseCluster().getRegionServer(0), daughterB.getRegionName());<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>        removeCompactedFiles(conn, timeout, daughterA);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        removeCompactedFiles(conn, timeout, daughterB);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  public static void removeCompactedFiles(Connection conn, long timeout, RegionInfo hri)<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      throws IOException, InterruptedException {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    log("remove compacted files for : " + hri.getRegionNameAsString());<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    List&lt;HRegion&gt; regions = TEST_UTIL.getHBaseCluster().getRegions(hri.getTable());<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    regions.stream().forEach(r -&gt; {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      try {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        r.getStores().get(0).closeAndArchiveCompactedFiles();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      } catch (IOException ioe) {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>        LOG.error("failed in removing compacted file", ioe);<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    });<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>  public static void blockUntilRegionIsInMeta(Connection conn, long timeout, RegionInfo hri)<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      throws IOException, InterruptedException {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    log("blocking until region is in META: " + hri.getRegionNameAsString());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    long start = System.currentTimeMillis();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      HRegionLocation loc = MetaTableAccessor.getRegionLocation(conn, hri);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      if (loc != null &amp;&amp; !loc.getRegionInfo().isOffline()) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        log("found region in META: " + hri.getRegionNameAsString());<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        break;<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Threads.sleep(10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  public static void blockUntilRegionIsOpened(Configuration conf, long timeout, RegionInfo hri)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      throws IOException, InterruptedException {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    log("blocking until region is opened for reading:" + hri.getRegionNameAsString());<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    long start = System.currentTimeMillis();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        Table table = conn.getTable(hri.getTable())) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>      byte[] row = hri.getStartKey();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      // Check for null/empty row. If we find one, use a key that is likely to be in first region.<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      if (row == null || row.length &lt;= 0) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        row = new byte[] { '0' };<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      Get get = new Get(row);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      while (System.currentTimeMillis() - start &lt; timeout) {<a name="line.528"></a>
+<s

<TRUNCATED>

[32/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
index 794e33b..3ec9a39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
@@ -1089,640 +1089,642 @@
 <span class="sourceLineNo">1081</span>  /**<a name="line.1081"></a>
 <span class="sourceLineNo">1082</span>   * @see #retrieveFromFile(int[])<a name="line.1082"></a>
 <span class="sourceLineNo">1083</span>   */<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  private void persistToFile() throws IOException {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    assert !cacheEnabled;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    if (!ioEngine.isPersistent()) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>  }<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>   * @see #persistToFile()<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>   */<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    File persistenceFile = new File(persistencePath);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (!persistenceFile.exists()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      return;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    assert !cacheEnabled;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      byte[] pbuf = new byte[pblen];<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      int read = in.read(pbuf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      if (read != pblen) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            persistencePath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  /**<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>   * &lt;pre&gt;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   *   File f = ...<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   *     // use the input stream<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   *   } finally {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   *   }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * &lt;/pre&gt;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * @param file the file to read and delete<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @return a FileInputStream for the given file<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @throws IOException if there is a problem creating the stream<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return new FileInputStream(file) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      public void close() throws IOException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        super.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (!file.delete()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    };<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      throws IOException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (capacitySize != cacheCapacity) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>  }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span><a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>  /**<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>   * cache<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   */<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>  private void checkIOErrorIsTolerated() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        disableCache();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    } else {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      this.ioErrorStartTime = now;<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>  /**<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   */<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>  private void disableCache() {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    if (!cacheEnabled) return;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    cacheEnabled = false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    ioEngine.shutdown();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    this.scheduleThreadPool.shutdown();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    this.ramCache.clear();<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.backingMap.clear();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  private void join() throws InterruptedException {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      writerThreads[i].join();<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  @Override<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  public void shutdown() {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    disableCache();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        + "; path to write=" + persistencePath);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        join();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>        persistToFile();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      } catch (IOException ex) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      } catch (InterruptedException e) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      }<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span><a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  public CacheStats getStats() {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    return cacheStats;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>  public BucketAllocator getAllocator() {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    return this.bucketAllocator;<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>  @Override<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public long heapSize() {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    return this.heapSize.sum();<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public long size() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return this.realCacheSize.sum();<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  @Override<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  public long getCurrentDataSize() {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    return size();<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  }<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>  @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>  public long getFreeSize() {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return this.bucketAllocator.getFreeSize();<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  public long getBlockCount() {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    return this.blockNumber.sum();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>  @Override<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  public long getDataBlockCount() {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    return getBlockCount();<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>  }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  @Override<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  public long getCurrentSize() {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    return this.bucketAllocator.getUsedSize();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  }<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>   * Evicts all blocks for a specific HFile.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * &lt;p&gt;<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   *<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * @return the number of blocks evicted<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    int numEvicted = 0;<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    for (BlockCacheKey key : keySet) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      if (evictBlock(key)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          ++numEvicted;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    return numEvicted;<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>  /**<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>   */<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  static class BucketEntry implements Serializable {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // access counter comparator, descending order<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    private int offsetBase;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    private int length;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private byte offset1;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    /**<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>     */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    byte deserialiserIndex;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    private volatile long accessCounter;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    private BlockPriority priority;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>     */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    private final long cachedTime = System.nanoTime();<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      setOffset(offset);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      this.length = length;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      this.accessCounter = accessCounter;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      if (inMemory) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        this.priority = BlockPriority.MEMORY;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.SINGLE;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    long offset() { // Java has no unsigned numbers<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return o &lt;&lt; 8;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private void setOffset(long value) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      assert (value &amp; 0xFF) == 0;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      value &gt;&gt;= 8;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      offsetBase = (int) value;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    public int getLength() {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return length;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span><a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<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>    public long getAccessCounter() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      return accessCounter;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span><a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    /**<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>     * Block has been accessed. Update its local access counter.<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>     */<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    public void access(long accessCounter) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      this.accessCounter = accessCounter;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        this.priority = BlockPriority.MULTI;<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><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    public BlockPriority getPriority() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return this.priority;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    public long getCachedTime() {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      return cachedTime;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    protected int getRefCount() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return 0;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    protected int incrementRefCountAndGet() {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      return 0;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span><a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    protected int decrementRefCountAndGet() {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    protected boolean isMarkedForEvict() {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      return false;<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    protected void markForEvict() {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      // noop;<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  static class SharedMemoryBucketEntry extends BucketEntry {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    private static final long serialVersionUID = -2187147283772338481L;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Set this when we were not able to forcefully evict the block<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    private volatile boolean markedForEvict;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    private AtomicInteger refCount = new AtomicInteger(0);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    SharedMemoryBucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      super(offset, length, accessCounter, inMemory);<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    @Override<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    protected int getRefCount() {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      return this.refCount.get();<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    @Override<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    protected int incrementRefCountAndGet() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      return this.refCount.incrementAndGet();<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>    @Override<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    protected int decrementRefCountAndGet() {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      return this.refCount.decrementAndGet();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    @Override<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    protected boolean isMarkedForEvict() {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      return this.markedForEvict;<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    @Override<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    protected void markForEvict() {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      this.markedForEvict = true;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  /**<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   * according to configuration parameters and their relative sizes.<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   */<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  private class BucketEntryGroup {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    private CachedEntryQueue queue;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    private long totalSize = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    private long bucketSize;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      this.bucketSize = bucketSize;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      totalSize = 0;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span><a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      totalSize += block.getValue().getLength();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      queue.add(block);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    public long free(long toFree) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>      long freedBytes = 0;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        if (evictBlock(entry.getKey(), false)) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          freedBytes += entry.getValue().getLength();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        }<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (freedBytes &gt;= toFree) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          return freedBytes;<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      }<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      return freedBytes;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    public long overflow() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      return totalSize - bucketSize;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span><a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    public long totalSize() {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      return totalSize;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span><a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  /**<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>   */<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  @VisibleForTesting<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>  static class RAMQueueEntry {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private BlockCacheKey key;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    private Cacheable data;<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    private long accessCounter;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    private boolean inMemory;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    public RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        boolean inMemory) {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>      this.key = bck;<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      this.data = data;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      this.accessCounter = accessCounter;<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>      this.inMemory = inMemory;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    public Cacheable getData() {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      return data;<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span><a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    public BlockCacheKey getKey() {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return key;<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    public void access(long accessCounter) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      this.accessCounter = accessCounter;<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    public BucketEntry writeToCache(final IOEngine ioEngine,<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        final BucketAllocator bucketAllocator,<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>        final LongAdder realCacheSize) throws CacheFullException, IOException,<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        BucketAllocatorException {<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      int len = data.getSerializedLength();<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      // This cacheable thing can't be serialized<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      if (len == 0) return null;<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      long offset = bucketAllocator.allocateBlock(len);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      BucketEntry bucketEntry = ioEngine.usesSharedMemory()<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>          ? UnsafeAvailChecker.isAvailable()<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>              ? new UnsafeSharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>              : new SharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          : new BucketEntry(offset, len, accessCounter, inMemory);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      bucketEntry.setDeserialiserReference(data.getDeserializer());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      try {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>        if (data instanceof HFileBlock) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>          HFileBlock block = (HFileBlock)data;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          if (LOG.isTraceEnabled()) {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>            LOG.trace("Write offset=" + offset + ", len=" + len);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>          }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>          ioEngine.write(sliceBuf, offset);<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>        } else {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>          data.serialize(bb, true);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>          ioEngine.write(bb, offset);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      } catch (IOException ioe) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        // free it in bucket allocator<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>        bucketAllocator.freeBlock(offset);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw ioe;<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      realCacheSize.add(len);<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      return bucketEntry;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    }<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  /**<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * Only used in test<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @throws InterruptedException<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   */<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      writerThread.disableWriter();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      writerThread.interrupt();<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      writerThread.join();<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>  }<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span><a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        this.backingMap.entrySet().iterator();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      private final long now = System.nanoTime();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      @Override<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      public boolean hasNext() {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>        return i.hasNext();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      @Override<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      public CachedBlock next() {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>        return new CachedBlock() {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>          @Override<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>          public String toString() {<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>            return BlockCacheUtil.toString(this, now);<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>          public BlockPriority getBlockPriority() {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            return e.getValue().getPriority();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>          }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          @Override<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>          public BlockType getBlockType() {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return null;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public long getOffset() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().getOffset();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public long getSize() {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            return e.getValue().getLength();<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          }<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>          @Override<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>          public long getCachedTime() {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            return e.getValue().getCachedTime();<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          public String getFilename() {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>            return e.getKey().getHfileName();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>          public int compareTo(CachedBlock other) {<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>            if (diff != 0) return diff;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span><a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            if (diff != 0) return diff;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>                other.getCachedTime());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>            }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span><a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          @Override<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>          public int hashCode() {<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            return e.getKey().hashCode();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          }<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>          @Override<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          public boolean equals(Object obj) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            if (obj instanceof CachedBlock) {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              return compareTo(cb) == 0;<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            } else {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>              return false;<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>            }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        };<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>      }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      @Override<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>      public void remove() {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>        throw new UnsupportedOperationException();<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>      }<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>    };<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  }<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  @Override<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  public BlockCache[] getBlockCaches() {<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    return null;<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span><a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  @Override<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    if (block.getMemoryType() == MemoryType.SHARED) {<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>      BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      if (bucketEntry != null) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>        int refCount = bucketEntry.decrementRefCountAndGet();<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        if (refCount == 0 &amp;&amp; bucketEntry.isMarkedForEvict()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          forceEvict(cacheKey);<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      }<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>  @VisibleForTesting<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>    if (bucketEntry != null) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      return bucketEntry.getRefCount();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    }<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    return 0;<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span><a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>  float getAcceptableFactor() {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    return acceptableFactor;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span><a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>  float getMinFactor() {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    return minFactor;<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>  float getExtraFreeFactor() {<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    return extraFreeFactor;<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>  }<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span><a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>  float getSingleFactor() {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    return singleFactor;<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  float getMultiFactor() {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    return multiFactor;<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>  }<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  float getMemoryFactor() {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    return memoryFactor;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>}<a name="line.1717"></a>
+<span class="sourceLineNo">1084</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  private void persistToFile() throws IOException {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    assert !cacheEnabled;<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>    if (!ioEngine.isPersistent()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<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>   * @see #persistToFile()<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   */<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    File persistenceFile = new File(persistencePath);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    if (!persistenceFile.exists()) {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    assert !cacheEnabled;<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      byte[] pbuf = new byte[pblen];<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      int read = in.read(pbuf);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      if (read != pblen) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            persistencePath);<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  /**<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>   * &lt;pre&gt;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>   *   File f = ...<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   *     // use the input stream<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   *   } finally {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>   *   }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   * &lt;/pre&gt;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @param file the file to read and delete<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>   * @return a FileInputStream for the given file<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>   * @throws IOException if there is a problem creating the stream<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>   */<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    return new FileInputStream(file) {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      public void close() throws IOException {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>        super.close();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>        if (!file.delete()) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>        }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    };<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>      throws IOException {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    if (capacitySize != cacheCapacity) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>          + ", expected:" + backingMap.getClass().getName());<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>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  /**<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * cache<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private void checkIOErrorIsTolerated() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        disableCache();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    } else {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      this.ioErrorStartTime = now;<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>    }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>  }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  private void disableCache() {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!cacheEnabled) return;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    cacheEnabled = false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    ioEngine.shutdown();<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.scheduleThreadPool.shutdown();<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    this.ramCache.clear();<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      this.backingMap.clear();<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>  }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>  private void join() throws InterruptedException {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      writerThreads[i].join();<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  public void shutdown() {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    disableCache();<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        + "; path to write=" + persistencePath);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      try {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>        join();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>        persistToFile();<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      } catch (IOException ex) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      } catch (InterruptedException e) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public CacheStats getStats() {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return cacheStats;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  public BucketAllocator getAllocator() {<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    return this.bucketAllocator;<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>  @Override<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  public long heapSize() {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    return this.heapSize.sum();<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  @Override<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public long size() {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    return this.realCacheSize.sum();<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  @Override<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>  public long getCurrentDataSize() {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    return size();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>  }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  public long getFreeSize() {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    return this.bucketAllocator.getFreeSize();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span><a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  @Override<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  public long getBlockCount() {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    return this.blockNumber.sum();<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>  @Override<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  public long getDataBlockCount() {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    return getBlockCount();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  public long getCurrentSize() {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    return this.bucketAllocator.getUsedSize();<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>  }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span><a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>  /**<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * Evicts all blocks for a specific HFile.<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * &lt;p&gt;<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   *<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>   * @return the number of blocks evicted<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span><a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    int numEvicted = 0;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    for (BlockCacheKey key : keySet) {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (evictBlock(key)) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>          ++numEvicted;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span><a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    return numEvicted;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>  }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>  /**<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   */<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  static class BucketEntry implements Serializable {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    // access counter comparator, descending order<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span><a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private int offsetBase;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private int length;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private byte offset1;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span><a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    /**<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>     */<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    byte deserialiserIndex;<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    private volatile long accessCounter;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    private BlockPriority priority;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span><a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    /**<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>     */<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    private final long cachedTime = System.nanoTime();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      setOffset(offset);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.length = length;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      this.accessCounter = accessCounter;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      if (inMemory) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.MEMORY;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      } else {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        this.priority = BlockPriority.SINGLE;<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    long offset() { // Java has no unsigned numbers<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      return o &lt;&lt; 8;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    private void setOffset(long value) {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      assert (value &amp; 0xFF) == 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      value &gt;&gt;= 8;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      offsetBase = (int) value;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    public int getLength() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return length;<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>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span><a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    public long getAccessCounter() {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      return accessCounter;<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    }<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span><a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    /**<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>     * Block has been accessed. Update its local access counter.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     */<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    public void access(long accessCounter) {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      this.accessCounter = accessCounter;<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        this.priority = BlockPriority.MULTI;<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    public BlockPriority getPriority() {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      return this.priority;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    public long getCachedTime() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      return cachedTime;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    protected int getRefCount() {<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      return 0;<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    

<TRUNCATED>

[13/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
index c658da2..3c4d549 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
@@ -56,710 +56,730 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.Waiter;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.zookeeper.KeeperException;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.junit.After;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.junit.AfterClass;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.junit.BeforeClass;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.junit.ClassRule;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.junit.Test;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.experimental.categories.Category;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.slf4j.Logger;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.slf4j.LoggerFactory;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>@Category(MediumTests.class)<a name="line.95"></a>
-<span class="sourceLineNo">096</span>public class TestNamespaceAuditor {<a name="line.96"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.zookeeper.KeeperException;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.After;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.AfterClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.BeforeClass;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.ClassRule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.slf4j.Logger;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.slf4j.LoggerFactory;<a name="line.96"></a>
 <span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @ClassRule<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static Admin ADMIN;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private String prefix = "TestNamespaceAuditor";<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @BeforeClass<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static void before() throws Exception {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    Configuration conf = UTIL.getConfiguration();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    conf.setStrings(<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      RegionServerObserver.class);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    UTIL.startMiniCluster(1, 1);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    waitForQuotaInitialize(UTIL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static void tearDown() throws Exception {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    UTIL.shutdownMiniCluster();<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>  @After<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void cleanup() throws Exception, KeeperException {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      ADMIN.disableTable(table.getTableName());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      deleteTable(table.getTableName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (ns.getName().startsWith(prefix)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        ADMIN.deleteNamespace(ns.getName());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public void testTableOperations() throws Exception {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    String nsp = prefix + "_np2";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    NamespaceDescriptor nspDesc =<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.147"></a>
-<span class="sourceLineNo">148</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ADMIN.createNamespace(nspDesc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    HTableDescriptor tableDescOne =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    tableDescOne.addFamily(fam1);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    HTableDescriptor tableDescTwo =<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    tableDescTwo.addFamily(fam1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    HTableDescriptor tableDescThree =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    tableDescThree.addFamily(fam1);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    ADMIN.createTable(tableDescOne);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    boolean constraintViolated = false;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    } catch (Exception exp) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      assertTrue(exp instanceof IOException);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      constraintViolated = true;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } finally {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        constraintViolated);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertNotNull(nspState);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    constraintViolated = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    try {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      ADMIN.createTable(tableDescThree);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } catch (Exception exp) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertTrue(exp instanceof IOException);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      constraintViolated = true;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        constraintViolated);<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><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @Test<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  public void testValidQuotas() throws Exception {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    boolean exceptionCaught = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    NamespaceDescriptor nspDesc =<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.198"></a>
-<span class="sourceLineNo">199</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      ADMIN.createNamespace(nspDesc);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } catch (Exception exp) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      LOG.warn(exp.toString(), exp);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      exceptionCaught = true;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    } finally {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      assertTrue(exceptionCaught);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    nspDesc =<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.211"></a>
-<span class="sourceLineNo">212</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      ADMIN.createNamespace(nspDesc);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    } catch (Exception exp) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.warn(exp.toString(), exp);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      exceptionCaught = true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    } finally {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      assertTrue(exceptionCaught);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    nspDesc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      ADMIN.createNamespace(nspDesc);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    } catch (Exception exp) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      LOG.warn(exp.toString(), exp);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      exceptionCaught = true;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    } finally {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      assertTrue(exceptionCaught);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    nspDesc =<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      ADMIN.createNamespace(nspDesc);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    } catch (Exception exp) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      LOG.warn(exp.toString(), exp);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      exceptionCaught = true;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } finally {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      assertTrue(exceptionCaught);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  public void testDeleteTable() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    String namespace = prefix + "_dummy";<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    NamespaceDescriptor nspDesc =<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        NamespaceDescriptor.create(namespace)<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    ADMIN.createNamespace(nspDesc);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HTableDescriptor tableDescOne =<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    tableDescOne.addFamily(fam1);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HTableDescriptor tableDescTwo =<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    tableDescTwo.addFamily(fam1);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    ADMIN.createTable(tableDescOne);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    deleteTable(tableDescOne.getTableName());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    deleteTable(tableDescTwo.getTableName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    ADMIN.deleteNamespace(namespace);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    stateInfo = getNamespaceState(namespace);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    assertNull("Namespace state not found to be null.", stateInfo);<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 static class CPRegionServerObserver<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private volatile boolean shouldFailMerge = false;<a name="line.290"></a>
-<span class="sourceLineNo">291</span><a name="line.291"></a>
-<span class="sourceLineNo">292</span>    public void failMerge(boolean fail) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      shouldFailMerge = fail;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>    private boolean triggered = false;<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      while (!triggered) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        wait();<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><a name="line.303"></a>
-<span class="sourceLineNo">304</span>    @Override<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return Optional.of(this);<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><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private volatile boolean shouldFailMerge = false;<a name="line.311"></a>
+<span class="sourceLineNo">098</span>@Category(MediumTests.class)<a name="line.98"></a>
+<span class="sourceLineNo">099</span>public class TestNamespaceAuditor {<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @ClassRule<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private static Admin ADMIN;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private String prefix = "TestNamespaceAuditor";<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @BeforeClass<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static void before() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Configuration conf = UTIL.getConfiguration();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    conf.setStrings(<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      RegionServerObserver.class);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    UTIL.startMiniCluster(1, 1);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    waitForQuotaInitialize(UTIL);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static void tearDown() throws Exception {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    UTIL.shutdownMiniCluster();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @After<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public void cleanup() throws Exception, KeeperException {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      ADMIN.disableTable(table.getTableName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      deleteTable(table.getTableName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if (ns.getName().startsWith(prefix)) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        ADMIN.deleteNamespace(ns.getName());<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>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void testTableOperations() throws Exception {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    String nsp = prefix + "_np2";<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    NamespaceDescriptor nspDesc =<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    ADMIN.createNamespace(nspDesc);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>    HTableDescriptor tableDescOne =<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    tableDescOne.addFamily(fam1);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    HTableDescriptor tableDescTwo =<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    tableDescTwo.addFamily(fam1);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    HTableDescriptor tableDescThree =<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    tableDescThree.addFamily(fam1);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    ADMIN.createTable(tableDescOne);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    boolean constraintViolated = false;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    try {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    } catch (Exception exp) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      assertTrue(exp instanceof IOException);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      constraintViolated = true;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    } finally {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        constraintViolated);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    assertNotNull(nspState);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    constraintViolated = false;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    try {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      ADMIN.createTable(tableDescThree);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    } catch (Exception exp) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      assertTrue(exp instanceof IOException);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      constraintViolated = true;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        constraintViolated);<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><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @Test<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void testValidQuotas() throws Exception {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    boolean exceptionCaught = false;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    NamespaceDescriptor nspDesc =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    try {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      ADMIN.createNamespace(nspDesc);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception exp) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      LOG.warn(exp.toString(), exp);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      exceptionCaught = true;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } finally {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      assertTrue(exceptionCaught);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    nspDesc =<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.213"></a>
+<span class="sourceLineNo">214</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.214"></a>
+<span class="sourceLineNo">215</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    try {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      ADMIN.createNamespace(nspDesc);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    } catch (Exception exp) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      LOG.warn(exp.toString(), exp);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      exceptionCaught = true;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(exceptionCaught);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    nspDesc =<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      ADMIN.createNamespace(nspDesc);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    } catch (Exception exp) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      LOG.warn(exp.toString(), exp);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      exceptionCaught = true;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    } finally {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertTrue(exceptionCaught);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    nspDesc =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.239"></a>
+<span class="sourceLineNo">240</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    try {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      ADMIN.createNamespace(nspDesc);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } catch (Exception exp) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      LOG.warn(exp.toString(), exp);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      exceptionCaught = true;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    } finally {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      assertTrue(exceptionCaught);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Test<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void testDeleteTable() throws Exception {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    String namespace = prefix + "_dummy";<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    NamespaceDescriptor nspDesc =<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        NamespaceDescriptor.create(namespace)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    ADMIN.createNamespace(nspDesc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    HTableDescriptor tableDescOne =<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    tableDescOne.addFamily(fam1);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    HTableDescriptor tableDescTwo =<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    tableDescTwo.addFamily(fam1);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    ADMIN.createTable(tableDescOne);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    deleteTable(tableDescOne.getTableName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    deleteTable(tableDescTwo.getTableName());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    ADMIN.deleteNamespace(namespace);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    stateInfo = getNamespaceState(namespace);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    assertNull("Namespace state not found to be null.", stateInfo);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  public static class CPRegionServerObserver<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    private volatile boolean shouldFailMerge = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    public void failMerge(boolean fail) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      shouldFailMerge = fail;<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>    private boolean triggered = false;<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      while (!triggered) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        wait();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    @Override<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return Optional.of(this);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    public void failMerge(boolean fail) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      shouldFailMerge = fail;<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>    @Override<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      return Optional.of(this);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    @Override<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    public synchronized void preMergeRegionsAction(<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      notifyAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (shouldFailMerge) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new IOException("fail merge");<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  @Test<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  public void testRegionMerge() throws Exception {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    String nsp1 = prefix + "_regiontest";<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    final int initialRegions = 3;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    NamespaceDescriptor nspDesc =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        NamespaceDescriptor.create(nsp1)<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    ADMIN.createNamespace(nspDesc);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    ADMIN.flush(tableTwo);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    assertEquals(initialRegions, hris.size());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      false);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    f.get(10, TimeUnit.SECONDS);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    regionToSplit.compact(true);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // wait a while to let the ongoing compaction finish.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    UTIL.waitFor(10000, regionToSplit::isSplittable);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    ADMIN.splitRegionAsync(regionToSplit.getRegionInfo().getRegionName(), splitKey).get(10,<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      TimeUnit.SECONDS);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(initialRegions, hris.size());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // Fail region merge through Coprocessor hook<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    MiniHBaseCluster cluster = UTIL.getHBaseCluster();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    MasterCoprocessorHost cpHost = cluster.getMaster().getMasterCoprocessorHost();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Coprocessor coprocessor = cpHost.findCoprocessor(CPMasterObserver.class);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    CPMasterObserver masterObserver = (CPMasterObserver) coprocessor;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    masterObserver.failMerge(true);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    f = ADMIN.mergeRegionsAsync(<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      hris.get(2).getEncodedNameAsBytes(),<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      false);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    try {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      f.get(10, TimeUnit.SECONDS);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      fail("Merge was supposed to fail!");<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    } catch (ExecutionException ee) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      // Expected.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(initialRegions, hris.size());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // verify that we cannot split<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    try {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      fail();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    } catch (DoNotRetryRegionException e) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      // Expected<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    Thread.sleep(2000);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    assertEquals(initialRegions, ADMIN.getRegions(tableTwo).size());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  /*<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   * Create a table and make sure that the table creation fails after adding this table entry into<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * namespace quota cache. Now correct the failure and recreate the table with same name.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * HBASE-13394<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   */<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  @Test<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public void testRecreateTableWithSameNameAfterFirstTimeFailure() throws Exception {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    String nsp1 = prefix + "_testRecreateTable";<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    NamespaceDescriptor nspDesc =<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        NamespaceDescriptor.create(nsp1)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "1").build();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    ADMIN.createNamespace(nspDesc);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    final TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    MasterSyncObserver.throwExceptionInPreCreateTableAction = true;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        ADMIN.createTable(tableDescOne);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        fail("Table " + tableOne.toString() + "creation should fail.");<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      } catch (Exception exp) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        LOG.error(exp.toString(), exp);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      assertFalse(ADMIN.tableExists(tableOne));<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp1);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      assertEquals("First table creation failed in namespace so number of tables in namespace "<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          + "should be 0.", 0, nstate.getTables().size());<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      try {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        ADMIN.createTable(tableDescOne);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      } catch (Exception e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        fail("Table " + tableOne.toString() + "creation should succeed.");<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        LOG.error(e.toString(), e);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertTrue(ADMIN.tableExists(tableOne));<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      nstate = getNamespaceState(nsp1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      assertEquals("First table was created successfully so table size in namespace should "<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          + "be one now.", 1, nstate.getTables().size());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } finally {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      if (ADMIN.tableExists(tableOne)) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        ADMIN.disableTable(tableOne);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        deleteTable(tableOne);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      ADMIN.deleteNamespace(nsp1);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    }<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>  private NamespaceTableAndRegionInfo getNamespaceState(String namespace) throws KeeperException,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getQuotaManager().getState(namespace);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  byte[] getSplitKey(byte[] startKey, byte[] endKey) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    String skey = Bytes.toString(startKey);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    int key;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    if (StringUtils.isBlank(skey)) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      key = Integer.parseInt(Bytes.toString(endKey))/2 ;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    } else {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      key = (int) (Integer.parseInt(skey) * 1.5);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    return Bytes.toBytes("" + key);<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>  public static class CustomObserver implements RegionCoprocessor, RegionObserver {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    volatile CountDownLatch postCompact;<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        throws IOException {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      postCompact.countDown();<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      postCompact = new CountDownLatch(1);<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>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return Optional.of(this);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Test<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public void testStatePreserve() throws Exception {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    final String nsp1 = prefix + "_testStatePreserve";<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp1)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "10").build();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    ADMIN.createNamespace(nspDesc);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    TableName tableThree = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table3");<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    tableDescOne.addFamily(fam1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    HTableDescriptor tableDescTwo = new HTableDescriptor(tableTwo);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    tableDescTwo.addFamily(fam1);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    HTableDescriptor tableDescThree = new HTableDescriptor(tableThree);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    tableDescThree.addFamily(fam1);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    ADMIN.createTable(tableDescThree, Bytes.toBytes("1"), Bytes.toBytes("1000"), 4);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    ADMIN.disableTable(tableThree);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    deleteTable(tableThree);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    // wait for chore to complete<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    UTIL.waitFor(1000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      @Override<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      public boolean evaluate() throws Exception {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>       return (getNamespaceState(nsp1).getTables().size() == 2);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    });<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    NamespaceTableAndRegionInfo before = getNamespaceState(nsp1);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    restartMaster();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    NamespaceTableAndRegionInfo after = getNamespaceState(nsp1);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    assertEquals("Expected: " + before.getTables() + " Found: " + after.getTables(), before<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        .getTables().size(), after.getTables().size());<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void waitForQuotaInitialize(final HBaseTestingUtility util) throws Exception {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    util.waitFor(60000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      public boolean evaluate() throws Exception {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        HMaster master = util.getHBaseCluster().getMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (master == null) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          return false;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        MasterQuotaManager quotaManager = master.getMasterQuotaManager();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        return quotaManager != null &amp;&amp; quotaManager.isQuotaInitialized();<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>  }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  private void restartMaster() throws Exception {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    UTIL.getHBaseCluster().getMaster(0).stop("Stopping to start again");<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    UTIL.getHBaseCluster().waitOnMaster(0);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    UTIL.getHBaseCluster().startMaster();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    waitForQuotaInitialize(UTIL);<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>  private NamespaceAuditor getQuotaManager() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return UTIL.getHBaseCluster().getMaster()<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        .getMasterQuotaManager().getNamespaceQuotaManager();<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>  public static class MasterSyncObserver implements MasterCoprocessor, MasterObserver {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    volatile CountDownLatch tableDeletionLatch;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    static boolean throwExceptionInPreCreateTableAction;<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      return Optional.of(this);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>    @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    public void preDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        TableName tableName) throws IOException {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      tableDeletionLatch = new CountDownLatch(1);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
+<span class="sourceLineNo">313</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private volatile boolean shouldFailMerge = false;<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public void failMerge(boolean fail) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      shouldFailMerge = fail;<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>    @Override<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      return Optional.of(this);<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>    @Override<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    public synchronized void preMergeRegionsAction(<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      notifyAll();<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (shouldFailMerge) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        throw new IOException("fail merge");<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>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  @Test<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public void testRegionMerge() throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    String nsp1 = prefix + "_regiontest";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    final int initialRegions = 3;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    NamespaceDescriptor nspDesc =<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        NamespaceDescriptor.create(nsp1)<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ADMIN.createNamespace(nspDesc);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    ADMIN.flush(tableTwo);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    assertEquals(initialRegions, hris.size());<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      false);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    f.get(10, TimeUnit.SECONDS);<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    regionToSplit.compact(true);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    // Waiting for compaction to finish<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    UTIL.waitFor(30000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      @Override<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      public boolean evaluate() throws Exception {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        return (CompactionState.NONE == ADMIN<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            .getCompactionStateForRegion(regionToSplit.getRegionInfo().getRegionName()));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    });<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // Cleaning compacted references for split to proceed<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    regionToSplit.getStores().stream().forEach(s -&gt; {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      try {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        s.closeAndArchiveCompactedFiles();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      } catch (IOException e1) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        LOG.error("Error whiling cleaning compacted file");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    });<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    // wait a while to let the ongoing compaction finish.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    UTIL.waitFor(10000, regionToSplit::isSplittable);<a name="line.390"></a>
+

<TRUNCATED>

[33/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
index 794e33b..3ec9a39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
@@ -1089,640 +1089,642 @@
 <span class="sourceLineNo">1081</span>  /**<a name="line.1081"></a>
 <span class="sourceLineNo">1082</span>   * @see #retrieveFromFile(int[])<a name="line.1082"></a>
 <span class="sourceLineNo">1083</span>   */<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  private void persistToFile() throws IOException {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    assert !cacheEnabled;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    if (!ioEngine.isPersistent()) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>  }<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>   * @see #persistToFile()<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>   */<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    File persistenceFile = new File(persistencePath);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (!persistenceFile.exists()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      return;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    assert !cacheEnabled;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      byte[] pbuf = new byte[pblen];<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      int read = in.read(pbuf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      if (read != pblen) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            persistencePath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  /**<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>   * &lt;pre&gt;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   *   File f = ...<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   *     // use the input stream<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   *   } finally {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   *   }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * &lt;/pre&gt;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * @param file the file to read and delete<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @return a FileInputStream for the given file<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @throws IOException if there is a problem creating the stream<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return new FileInputStream(file) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      public void close() throws IOException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        super.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (!file.delete()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    };<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      throws IOException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (capacitySize != cacheCapacity) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>  }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span><a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>  /**<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>   * cache<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   */<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>  private void checkIOErrorIsTolerated() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        disableCache();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    } else {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      this.ioErrorStartTime = now;<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>  /**<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   */<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>  private void disableCache() {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    if (!cacheEnabled) return;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    cacheEnabled = false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    ioEngine.shutdown();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    this.scheduleThreadPool.shutdown();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    this.ramCache.clear();<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.backingMap.clear();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  private void join() throws InterruptedException {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      writerThreads[i].join();<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  @Override<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  public void shutdown() {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    disableCache();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        + "; path to write=" + persistencePath);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        join();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>        persistToFile();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      } catch (IOException ex) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      } catch (InterruptedException e) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      }<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span><a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  public CacheStats getStats() {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    return cacheStats;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>  public BucketAllocator getAllocator() {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    return this.bucketAllocator;<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>  @Override<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public long heapSize() {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    return this.heapSize.sum();<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public long size() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return this.realCacheSize.sum();<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  @Override<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  public long getCurrentDataSize() {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    return size();<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  }<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>  @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>  public long getFreeSize() {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return this.bucketAllocator.getFreeSize();<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  public long getBlockCount() {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    return this.blockNumber.sum();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>  @Override<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  public long getDataBlockCount() {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    return getBlockCount();<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>  }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  @Override<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  public long getCurrentSize() {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    return this.bucketAllocator.getUsedSize();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  }<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>   * Evicts all blocks for a specific HFile.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * &lt;p&gt;<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   *<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * @return the number of blocks evicted<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    int numEvicted = 0;<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    for (BlockCacheKey key : keySet) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      if (evictBlock(key)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          ++numEvicted;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    return numEvicted;<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>  /**<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>   */<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  static class BucketEntry implements Serializable {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // access counter comparator, descending order<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    private int offsetBase;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    private int length;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private byte offset1;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    /**<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>     */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    byte deserialiserIndex;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    private volatile long accessCounter;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    private BlockPriority priority;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>     */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    private final long cachedTime = System.nanoTime();<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      setOffset(offset);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      this.length = length;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      this.accessCounter = accessCounter;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      if (inMemory) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        this.priority = BlockPriority.MEMORY;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.SINGLE;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    long offset() { // Java has no unsigned numbers<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return o &lt;&lt; 8;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private void setOffset(long value) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      assert (value &amp; 0xFF) == 0;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      value &gt;&gt;= 8;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      offsetBase = (int) value;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    public int getLength() {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return length;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span><a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<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>    public long getAccessCounter() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      return accessCounter;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span><a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    /**<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>     * Block has been accessed. Update its local access counter.<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>     */<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    public void access(long accessCounter) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      this.accessCounter = accessCounter;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        this.priority = BlockPriority.MULTI;<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><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    public BlockPriority getPriority() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return this.priority;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    public long getCachedTime() {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      return cachedTime;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    protected int getRefCount() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return 0;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    protected int incrementRefCountAndGet() {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      return 0;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span><a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    protected int decrementRefCountAndGet() {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    protected boolean isMarkedForEvict() {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      return false;<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    protected void markForEvict() {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      // noop;<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  static class SharedMemoryBucketEntry extends BucketEntry {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    private static final long serialVersionUID = -2187147283772338481L;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Set this when we were not able to forcefully evict the block<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    private volatile boolean markedForEvict;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    private AtomicInteger refCount = new AtomicInteger(0);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    SharedMemoryBucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      super(offset, length, accessCounter, inMemory);<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    @Override<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    protected int getRefCount() {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      return this.refCount.get();<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    @Override<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    protected int incrementRefCountAndGet() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      return this.refCount.incrementAndGet();<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>    @Override<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    protected int decrementRefCountAndGet() {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      return this.refCount.decrementAndGet();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    @Override<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    protected boolean isMarkedForEvict() {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      return this.markedForEvict;<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    @Override<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    protected void markForEvict() {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      this.markedForEvict = true;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  /**<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   * according to configuration parameters and their relative sizes.<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   */<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  private class BucketEntryGroup {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    private CachedEntryQueue queue;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    private long totalSize = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    private long bucketSize;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      this.bucketSize = bucketSize;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      totalSize = 0;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span><a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      totalSize += block.getValue().getLength();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      queue.add(block);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    public long free(long toFree) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>      long freedBytes = 0;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        if (evictBlock(entry.getKey(), false)) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          freedBytes += entry.getValue().getLength();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        }<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (freedBytes &gt;= toFree) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          return freedBytes;<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      }<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      return freedBytes;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    public long overflow() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      return totalSize - bucketSize;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span><a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    public long totalSize() {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      return totalSize;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span><a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  /**<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>   */<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  @VisibleForTesting<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>  static class RAMQueueEntry {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private BlockCacheKey key;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    private Cacheable data;<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    private long accessCounter;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    private boolean inMemory;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    public RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        boolean inMemory) {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>      this.key = bck;<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      this.data = data;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      this.accessCounter = accessCounter;<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>      this.inMemory = inMemory;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    public Cacheable getData() {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      return data;<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span><a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    public BlockCacheKey getKey() {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return key;<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    public void access(long accessCounter) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      this.accessCounter = accessCounter;<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    public BucketEntry writeToCache(final IOEngine ioEngine,<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        final BucketAllocator bucketAllocator,<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>        final LongAdder realCacheSize) throws CacheFullException, IOException,<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        BucketAllocatorException {<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      int len = data.getSerializedLength();<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      // This cacheable thing can't be serialized<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      if (len == 0) return null;<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      long offset = bucketAllocator.allocateBlock(len);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      BucketEntry bucketEntry = ioEngine.usesSharedMemory()<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>          ? UnsafeAvailChecker.isAvailable()<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>              ? new UnsafeSharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>              : new SharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          : new BucketEntry(offset, len, accessCounter, inMemory);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      bucketEntry.setDeserialiserReference(data.getDeserializer());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      try {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>        if (data instanceof HFileBlock) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>          HFileBlock block = (HFileBlock)data;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          if (LOG.isTraceEnabled()) {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>            LOG.trace("Write offset=" + offset + ", len=" + len);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>          }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>          ioEngine.write(sliceBuf, offset);<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>        } else {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>          data.serialize(bb, true);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>          ioEngine.write(bb, offset);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      } catch (IOException ioe) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        // free it in bucket allocator<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>        bucketAllocator.freeBlock(offset);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw ioe;<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      realCacheSize.add(len);<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      return bucketEntry;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    }<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  /**<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * Only used in test<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @throws InterruptedException<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   */<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      writerThread.disableWriter();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      writerThread.interrupt();<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      writerThread.join();<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>  }<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span><a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        this.backingMap.entrySet().iterator();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      private final long now = System.nanoTime();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      @Override<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      public boolean hasNext() {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>        return i.hasNext();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      @Override<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      public CachedBlock next() {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>        return new CachedBlock() {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>          @Override<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>          public String toString() {<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>            return BlockCacheUtil.toString(this, now);<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>          public BlockPriority getBlockPriority() {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            return e.getValue().getPriority();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>          }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          @Override<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>          public BlockType getBlockType() {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return null;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public long getOffset() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().getOffset();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public long getSize() {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            return e.getValue().getLength();<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          }<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>          @Override<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>          public long getCachedTime() {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            return e.getValue().getCachedTime();<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          public String getFilename() {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>            return e.getKey().getHfileName();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>          public int compareTo(CachedBlock other) {<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>            if (diff != 0) return diff;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span><a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            if (diff != 0) return diff;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>                other.getCachedTime());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>            }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span><a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          @Override<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>          public int hashCode() {<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            return e.getKey().hashCode();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          }<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>          @Override<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          public boolean equals(Object obj) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            if (obj instanceof CachedBlock) {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              return compareTo(cb) == 0;<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            } else {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>              return false;<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>            }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        };<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>      }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      @Override<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>      public void remove() {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>        throw new UnsupportedOperationException();<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>      }<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>    };<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  }<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  @Override<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  public BlockCache[] getBlockCaches() {<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    return null;<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span><a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  @Override<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    if (block.getMemoryType() == MemoryType.SHARED) {<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>      BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      if (bucketEntry != null) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>        int refCount = bucketEntry.decrementRefCountAndGet();<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        if (refCount == 0 &amp;&amp; bucketEntry.isMarkedForEvict()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          forceEvict(cacheKey);<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      }<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>  @VisibleForTesting<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>    if (bucketEntry != null) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      return bucketEntry.getRefCount();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    }<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    return 0;<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span><a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>  float getAcceptableFactor() {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    return acceptableFactor;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span><a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>  float getMinFactor() {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    return minFactor;<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>  float getExtraFreeFactor() {<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    return extraFreeFactor;<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>  }<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span><a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>  float getSingleFactor() {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    return singleFactor;<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  float getMultiFactor() {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    return multiFactor;<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>  }<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  float getMemoryFactor() {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    return memoryFactor;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>}<a name="line.1717"></a>
+<span class="sourceLineNo">1084</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  private void persistToFile() throws IOException {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    assert !cacheEnabled;<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>    if (!ioEngine.isPersistent()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<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>   * @see #persistToFile()<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   */<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    File persistenceFile = new File(persistencePath);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    if (!persistenceFile.exists()) {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    assert !cacheEnabled;<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      byte[] pbuf = new byte[pblen];<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      int read = in.read(pbuf);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      if (read != pblen) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            persistencePath);<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  /**<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>   * &lt;pre&gt;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>   *   File f = ...<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   *     // use the input stream<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   *   } finally {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>   *   }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   * &lt;/pre&gt;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @param file the file to read and delete<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>   * @return a FileInputStream for the given file<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>   * @throws IOException if there is a problem creating the stream<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>   */<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    return new FileInputStream(file) {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      public void close() throws IOException {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>        super.close();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>        if (!file.delete()) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>        }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    };<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>      throws IOException {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    if (capacitySize != cacheCapacity) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>          + ", expected:" + backingMap.getClass().getName());<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>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  /**<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * cache<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private void checkIOErrorIsTolerated() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        disableCache();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    } else {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      this.ioErrorStartTime = now;<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>    }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>  }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  private void disableCache() {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!cacheEnabled) return;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    cacheEnabled = false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    ioEngine.shutdown();<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.scheduleThreadPool.shutdown();<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    this.ramCache.clear();<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      this.backingMap.clear();<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>  }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>  private void join() throws InterruptedException {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      writerThreads[i].join();<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  public void shutdown() {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    disableCache();<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        + "; path to write=" + persistencePath);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      try {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>        join();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>        persistToFile();<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      } catch (IOException ex) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      } catch (InterruptedException e) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public CacheStats getStats() {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return cacheStats;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  public BucketAllocator getAllocator() {<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    return this.bucketAllocator;<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>  @Override<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  public long heapSize() {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    return this.heapSize.sum();<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  @Override<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public long size() {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    return this.realCacheSize.sum();<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  @Override<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>  public long getCurrentDataSize() {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    return size();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>  }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  public long getFreeSize() {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    return this.bucketAllocator.getFreeSize();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span><a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  @Override<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  public long getBlockCount() {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    return this.blockNumber.sum();<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>  @Override<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  public long getDataBlockCount() {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    return getBlockCount();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  public long getCurrentSize() {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    return this.bucketAllocator.getUsedSize();<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>  }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span><a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>  /**<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * Evicts all blocks for a specific HFile.<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * &lt;p&gt;<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   *<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>   * @return the number of blocks evicted<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span><a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    int numEvicted = 0;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    for (BlockCacheKey key : keySet) {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (evictBlock(key)) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>          ++numEvicted;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span><a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    return numEvicted;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>  }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>  /**<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   */<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  static class BucketEntry implements Serializable {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    // access counter comparator, descending order<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span><a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private int offsetBase;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private int length;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private byte offset1;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span><a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    /**<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>     */<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    byte deserialiserIndex;<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    private volatile long accessCounter;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    private BlockPriority priority;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span><a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    /**<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>     */<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    private final long cachedTime = System.nanoTime();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      setOffset(offset);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.length = length;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      this.accessCounter = accessCounter;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      if (inMemory) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.MEMORY;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      } else {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        this.priority = BlockPriority.SINGLE;<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    long offset() { // Java has no unsigned numbers<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      return o &lt;&lt; 8;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    private void setOffset(long value) {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      assert (value &amp; 0xFF) == 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      value &gt;&gt;= 8;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      offsetBase = (int) value;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    public int getLength() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return length;<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>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span><a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    public long getAccessCounter() {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      return accessCounter;<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    }<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span><a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    /**<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>     * Block has been accessed. Update its local access counter.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     */<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    public void access(long accessCounter) {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      this.accessCounter = accessCounter;<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        this.priority = BlockPriority.MULTI;<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    public BlockPriority getPriority() {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      return this.priority;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    public long getCachedTime() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      return cachedTime;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    protected int getRefCount() {<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      return 0;<a name="line.1390"></a>
+<span class="sourceLineNo">

<TRUNCATED>

[15/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
index c658da2..3c4d549 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
@@ -56,710 +56,730 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.Waiter;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.zookeeper.KeeperException;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.junit.After;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.junit.AfterClass;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.junit.BeforeClass;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.junit.ClassRule;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.junit.Test;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.experimental.categories.Category;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.slf4j.Logger;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.slf4j.LoggerFactory;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>@Category(MediumTests.class)<a name="line.95"></a>
-<span class="sourceLineNo">096</span>public class TestNamespaceAuditor {<a name="line.96"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.zookeeper.KeeperException;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.After;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.AfterClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.BeforeClass;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.ClassRule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.slf4j.Logger;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.slf4j.LoggerFactory;<a name="line.96"></a>
 <span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @ClassRule<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static Admin ADMIN;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private String prefix = "TestNamespaceAuditor";<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @BeforeClass<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static void before() throws Exception {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    Configuration conf = UTIL.getConfiguration();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    conf.setStrings(<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      RegionServerObserver.class);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    UTIL.startMiniCluster(1, 1);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    waitForQuotaInitialize(UTIL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static void tearDown() throws Exception {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    UTIL.shutdownMiniCluster();<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>  @After<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void cleanup() throws Exception, KeeperException {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      ADMIN.disableTable(table.getTableName());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      deleteTable(table.getTableName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (ns.getName().startsWith(prefix)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        ADMIN.deleteNamespace(ns.getName());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public void testTableOperations() throws Exception {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    String nsp = prefix + "_np2";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    NamespaceDescriptor nspDesc =<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.147"></a>
-<span class="sourceLineNo">148</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ADMIN.createNamespace(nspDesc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    HTableDescriptor tableDescOne =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    tableDescOne.addFamily(fam1);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    HTableDescriptor tableDescTwo =<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    tableDescTwo.addFamily(fam1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    HTableDescriptor tableDescThree =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    tableDescThree.addFamily(fam1);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    ADMIN.createTable(tableDescOne);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    boolean constraintViolated = false;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    } catch (Exception exp) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      assertTrue(exp instanceof IOException);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      constraintViolated = true;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } finally {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        constraintViolated);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertNotNull(nspState);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    constraintViolated = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    try {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      ADMIN.createTable(tableDescThree);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } catch (Exception exp) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertTrue(exp instanceof IOException);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      constraintViolated = true;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        constraintViolated);<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><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @Test<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  public void testValidQuotas() throws Exception {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    boolean exceptionCaught = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    NamespaceDescriptor nspDesc =<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.198"></a>
-<span class="sourceLineNo">199</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      ADMIN.createNamespace(nspDesc);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } catch (Exception exp) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      LOG.warn(exp.toString(), exp);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      exceptionCaught = true;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    } finally {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      assertTrue(exceptionCaught);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    nspDesc =<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.211"></a>
-<span class="sourceLineNo">212</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      ADMIN.createNamespace(nspDesc);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    } catch (Exception exp) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.warn(exp.toString(), exp);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      exceptionCaught = true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    } finally {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      assertTrue(exceptionCaught);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    nspDesc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      ADMIN.createNamespace(nspDesc);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    } catch (Exception exp) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      LOG.warn(exp.toString(), exp);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      exceptionCaught = true;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    } finally {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      assertTrue(exceptionCaught);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    nspDesc =<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      ADMIN.createNamespace(nspDesc);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    } catch (Exception exp) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      LOG.warn(exp.toString(), exp);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      exceptionCaught = true;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } finally {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      assertTrue(exceptionCaught);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  public void testDeleteTable() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    String namespace = prefix + "_dummy";<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    NamespaceDescriptor nspDesc =<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        NamespaceDescriptor.create(namespace)<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    ADMIN.createNamespace(nspDesc);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HTableDescriptor tableDescOne =<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    tableDescOne.addFamily(fam1);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HTableDescriptor tableDescTwo =<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    tableDescTwo.addFamily(fam1);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    ADMIN.createTable(tableDescOne);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    deleteTable(tableDescOne.getTableName());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    deleteTable(tableDescTwo.getTableName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    ADMIN.deleteNamespace(namespace);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    stateInfo = getNamespaceState(namespace);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    assertNull("Namespace state not found to be null.", stateInfo);<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 static class CPRegionServerObserver<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private volatile boolean shouldFailMerge = false;<a name="line.290"></a>
-<span class="sourceLineNo">291</span><a name="line.291"></a>
-<span class="sourceLineNo">292</span>    public void failMerge(boolean fail) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      shouldFailMerge = fail;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>    private boolean triggered = false;<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      while (!triggered) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        wait();<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><a name="line.303"></a>
-<span class="sourceLineNo">304</span>    @Override<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return Optional.of(this);<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><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private volatile boolean shouldFailMerge = false;<a name="line.311"></a>
+<span class="sourceLineNo">098</span>@Category(MediumTests.class)<a name="line.98"></a>
+<span class="sourceLineNo">099</span>public class TestNamespaceAuditor {<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @ClassRule<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private static Admin ADMIN;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private String prefix = "TestNamespaceAuditor";<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @BeforeClass<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static void before() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Configuration conf = UTIL.getConfiguration();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    conf.setStrings(<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      RegionServerObserver.class);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    UTIL.startMiniCluster(1, 1);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    waitForQuotaInitialize(UTIL);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static void tearDown() throws Exception {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    UTIL.shutdownMiniCluster();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @After<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public void cleanup() throws Exception, KeeperException {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      ADMIN.disableTable(table.getTableName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      deleteTable(table.getTableName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if (ns.getName().startsWith(prefix)) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        ADMIN.deleteNamespace(ns.getName());<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>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void testTableOperations() throws Exception {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    String nsp = prefix + "_np2";<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    NamespaceDescriptor nspDesc =<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    ADMIN.createNamespace(nspDesc);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>    HTableDescriptor tableDescOne =<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    tableDescOne.addFamily(fam1);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    HTableDescriptor tableDescTwo =<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    tableDescTwo.addFamily(fam1);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    HTableDescriptor tableDescThree =<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    tableDescThree.addFamily(fam1);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    ADMIN.createTable(tableDescOne);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    boolean constraintViolated = false;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    try {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    } catch (Exception exp) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      assertTrue(exp instanceof IOException);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      constraintViolated = true;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    } finally {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        constraintViolated);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    assertNotNull(nspState);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    constraintViolated = false;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    try {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      ADMIN.createTable(tableDescThree);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    } catch (Exception exp) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      assertTrue(exp instanceof IOException);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      constraintViolated = true;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        constraintViolated);<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><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @Test<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void testValidQuotas() throws Exception {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    boolean exceptionCaught = false;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    NamespaceDescriptor nspDesc =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    try {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      ADMIN.createNamespace(nspDesc);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception exp) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      LOG.warn(exp.toString(), exp);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      exceptionCaught = true;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } finally {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      assertTrue(exceptionCaught);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    nspDesc =<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.213"></a>
+<span class="sourceLineNo">214</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.214"></a>
+<span class="sourceLineNo">215</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    try {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      ADMIN.createNamespace(nspDesc);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    } catch (Exception exp) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      LOG.warn(exp.toString(), exp);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      exceptionCaught = true;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(exceptionCaught);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    nspDesc =<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      ADMIN.createNamespace(nspDesc);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    } catch (Exception exp) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      LOG.warn(exp.toString(), exp);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      exceptionCaught = true;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    } finally {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertTrue(exceptionCaught);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    nspDesc =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.239"></a>
+<span class="sourceLineNo">240</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    try {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      ADMIN.createNamespace(nspDesc);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } catch (Exception exp) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      LOG.warn(exp.toString(), exp);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      exceptionCaught = true;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    } finally {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      assertTrue(exceptionCaught);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Test<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void testDeleteTable() throws Exception {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    String namespace = prefix + "_dummy";<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    NamespaceDescriptor nspDesc =<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        NamespaceDescriptor.create(namespace)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    ADMIN.createNamespace(nspDesc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    HTableDescriptor tableDescOne =<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    tableDescOne.addFamily(fam1);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    HTableDescriptor tableDescTwo =<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    tableDescTwo.addFamily(fam1);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    ADMIN.createTable(tableDescOne);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    deleteTable(tableDescOne.getTableName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    deleteTable(tableDescTwo.getTableName());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    ADMIN.deleteNamespace(namespace);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    stateInfo = getNamespaceState(namespace);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    assertNull("Namespace state not found to be null.", stateInfo);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  public static class CPRegionServerObserver<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    private volatile boolean shouldFailMerge = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    public void failMerge(boolean fail) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      shouldFailMerge = fail;<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>    private boolean triggered = false;<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      while (!triggered) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        wait();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    @Override<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return Optional.of(this);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    public void failMerge(boolean fail) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      shouldFailMerge = fail;<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>    @Override<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      return Optional.of(this);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    @Override<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    public synchronized void preMergeRegionsAction(<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      notifyAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (shouldFailMerge) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new IOException("fail merge");<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  @Test<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  public void testRegionMerge() throws Exception {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    String nsp1 = prefix + "_regiontest";<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    final int initialRegions = 3;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    NamespaceDescriptor nspDesc =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        NamespaceDescriptor.create(nsp1)<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    ADMIN.createNamespace(nspDesc);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    ADMIN.flush(tableTwo);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    assertEquals(initialRegions, hris.size());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      false);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    f.get(10, TimeUnit.SECONDS);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    regionToSplit.compact(true);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // wait a while to let the ongoing compaction finish.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    UTIL.waitFor(10000, regionToSplit::isSplittable);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    ADMIN.splitRegionAsync(regionToSplit.getRegionInfo().getRegionName(), splitKey).get(10,<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      TimeUnit.SECONDS);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(initialRegions, hris.size());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // Fail region merge through Coprocessor hook<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    MiniHBaseCluster cluster = UTIL.getHBaseCluster();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    MasterCoprocessorHost cpHost = cluster.getMaster().getMasterCoprocessorHost();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Coprocessor coprocessor = cpHost.findCoprocessor(CPMasterObserver.class);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    CPMasterObserver masterObserver = (CPMasterObserver) coprocessor;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    masterObserver.failMerge(true);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    f = ADMIN.mergeRegionsAsync(<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      hris.get(2).getEncodedNameAsBytes(),<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      false);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    try {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      f.get(10, TimeUnit.SECONDS);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      fail("Merge was supposed to fail!");<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    } catch (ExecutionException ee) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      // Expected.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(initialRegions, hris.size());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // verify that we cannot split<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    try {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      fail();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    } catch (DoNotRetryRegionException e) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      // Expected<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    Thread.sleep(2000);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    assertEquals(initialRegions, ADMIN.getRegions(tableTwo).size());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  /*<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   * Create a table and make sure that the table creation fails after adding this table entry into<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * namespace quota cache. Now correct the failure and recreate the table with same name.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * HBASE-13394<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   */<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  @Test<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public void testRecreateTableWithSameNameAfterFirstTimeFailure() throws Exception {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    String nsp1 = prefix + "_testRecreateTable";<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    NamespaceDescriptor nspDesc =<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        NamespaceDescriptor.create(nsp1)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "1").build();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    ADMIN.createNamespace(nspDesc);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    final TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    MasterSyncObserver.throwExceptionInPreCreateTableAction = true;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        ADMIN.createTable(tableDescOne);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        fail("Table " + tableOne.toString() + "creation should fail.");<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      } catch (Exception exp) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        LOG.error(exp.toString(), exp);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      assertFalse(ADMIN.tableExists(tableOne));<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp1);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      assertEquals("First table creation failed in namespace so number of tables in namespace "<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          + "should be 0.", 0, nstate.getTables().size());<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      try {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        ADMIN.createTable(tableDescOne);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      } catch (Exception e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        fail("Table " + tableOne.toString() + "creation should succeed.");<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        LOG.error(e.toString(), e);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertTrue(ADMIN.tableExists(tableOne));<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      nstate = getNamespaceState(nsp1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      assertEquals("First table was created successfully so table size in namespace should "<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          + "be one now.", 1, nstate.getTables().size());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } finally {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      if (ADMIN.tableExists(tableOne)) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        ADMIN.disableTable(tableOne);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        deleteTable(tableOne);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      ADMIN.deleteNamespace(nsp1);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    }<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>  private NamespaceTableAndRegionInfo getNamespaceState(String namespace) throws KeeperException,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getQuotaManager().getState(namespace);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  byte[] getSplitKey(byte[] startKey, byte[] endKey) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    String skey = Bytes.toString(startKey);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    int key;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    if (StringUtils.isBlank(skey)) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      key = Integer.parseInt(Bytes.toString(endKey))/2 ;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    } else {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      key = (int) (Integer.parseInt(skey) * 1.5);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    return Bytes.toBytes("" + key);<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>  public static class CustomObserver implements RegionCoprocessor, RegionObserver {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    volatile CountDownLatch postCompact;<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        throws IOException {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      postCompact.countDown();<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      postCompact = new CountDownLatch(1);<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>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return Optional.of(this);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Test<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public void testStatePreserve() throws Exception {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    final String nsp1 = prefix + "_testStatePreserve";<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp1)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "10").build();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    ADMIN.createNamespace(nspDesc);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    TableName tableThree = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table3");<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    tableDescOne.addFamily(fam1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    HTableDescriptor tableDescTwo = new HTableDescriptor(tableTwo);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    tableDescTwo.addFamily(fam1);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    HTableDescriptor tableDescThree = new HTableDescriptor(tableThree);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    tableDescThree.addFamily(fam1);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    ADMIN.createTable(tableDescThree, Bytes.toBytes("1"), Bytes.toBytes("1000"), 4);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    ADMIN.disableTable(tableThree);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    deleteTable(tableThree);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    // wait for chore to complete<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    UTIL.waitFor(1000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      @Override<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      public boolean evaluate() throws Exception {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>       return (getNamespaceState(nsp1).getTables().size() == 2);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    });<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    NamespaceTableAndRegionInfo before = getNamespaceState(nsp1);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    restartMaster();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    NamespaceTableAndRegionInfo after = getNamespaceState(nsp1);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    assertEquals("Expected: " + before.getTables() + " Found: " + after.getTables(), before<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        .getTables().size(), after.getTables().size());<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void waitForQuotaInitialize(final HBaseTestingUtility util) throws Exception {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    util.waitFor(60000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      public boolean evaluate() throws Exception {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        HMaster master = util.getHBaseCluster().getMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (master == null) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          return false;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        MasterQuotaManager quotaManager = master.getMasterQuotaManager();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        return quotaManager != null &amp;&amp; quotaManager.isQuotaInitialized();<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>  }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  private void restartMaster() throws Exception {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    UTIL.getHBaseCluster().getMaster(0).stop("Stopping to start again");<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    UTIL.getHBaseCluster().waitOnMaster(0);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    UTIL.getHBaseCluster().startMaster();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    waitForQuotaInitialize(UTIL);<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>  private NamespaceAuditor getQuotaManager() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return UTIL.getHBaseCluster().getMaster()<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        .getMasterQuotaManager().getNamespaceQuotaManager();<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>  public static class MasterSyncObserver implements MasterCoprocessor, MasterObserver {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    volatile CountDownLatch tableDeletionLatch;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    static boolean throwExceptionInPreCreateTableAction;<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      return Optional.of(this);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>    @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    public void preDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        TableName tableName) throws IOException {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      tableDeletionLatch = new CountDownLatch(1);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
+<span class="sourceLineNo">313</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private volatile boolean shouldFailMerge = false;<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public void failMerge(boolean fail) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      shouldFailMerge = fail;<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>    @Override<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      return Optional.of(this);<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>    @Override<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    public synchronized void preMergeRegionsAction(<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      notifyAll();<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (shouldFailMerge) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        throw new IOException("fail merge");<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>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  @Test<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public void testRegionMerge() throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    String nsp1 = prefix + "_regiontest";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    final int initialRegions = 3;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    NamespaceDescriptor nspDesc =<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        NamespaceDescriptor.create(nsp1)<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ADMIN.createNamespace(nspDesc);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    ADMIN.flush(tableTwo);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    assertEquals(initialRegions, hris.size());<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      false);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    f.get(10, TimeUnit.SECONDS);<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    regionToSplit.compact(true);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    // Waiting for compaction to finish<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    UTIL.waitFor(30000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      @Override<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      public boolean evaluate() throws Exception {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        return (CompactionState.NONE == ADMIN<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            .getCompactionStateForRegion(regionToSplit.getRegionInfo().getRegionName()));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    });<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // Cleaning compacted references for split to proceed<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    regionToSplit.getStores().stream().forEach(s -&gt; {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      try {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        s.closeAndArchiveCompactedFiles();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      } catch (IOException e1) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        LOG.error("Error whiling cleaning compacted file");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    });<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    // wait a while to let the ongoing compaction finish.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   

<TRUNCATED>

[41/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

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


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

Branch: refs/heads/asf-site
Commit: 7cafc4121fc0c858c3f581d7a7ce6f1d13d19140
Parents: 4ddbaa6
Author: jenkins <bu...@apache.org>
Authored: Sat Aug 18 14:47:49 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Sat Aug 18 14:47:49 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 11178 +++++++++--------
 checkstyle.rss                                  |     8 +-
 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                       |     6 +
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/client/package-tree.html       |    26 +-
 .../hadoop/hbase/coprocessor/package-tree.html  |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |     8 +-
 .../hfile/bucket/BucketCache.BucketEntry.html   |    50 +-
 .../bucket/BucketCache.BucketEntryGroup.html    |    18 +-
 .../hfile/bucket/BucketCache.RAMQueueEntry.html |    20 +-
 .../BucketCache.SharedMemoryBucketEntry.html    |    20 +-
 .../hbase/io/hfile/bucket/BucketCache.html      |    60 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     4 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     6 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    18 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     6 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |    34 +-
 .../hadoop/hbase/regionserver/HStore.html       |   158 +-
 .../hbase/regionserver/StoreFileReader.html     |   145 +-
 .../hbase/regionserver/StoreFileScanner.html    |    62 +-
 .../hadoop/hbase/regionserver/package-tree.html |    16 +-
 .../ScanQueryMatcher.MatchCode.html             |     4 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     8 +-
 .../hadoop/hbase/wal/WALFactory.Providers.html  |     4 +-
 .../org/apache/hadoop/hbase/wal/WALFactory.html |    77 +-
 .../wal/class-use/WALFactory.Providers.html     |     6 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../hfile/bucket/BucketCache.BucketEntry.html   |  1270 +-
 .../bucket/BucketCache.BucketEntryGroup.html    |  1270 +-
 .../hfile/bucket/BucketCache.RAMQueueEntry.html |  1270 +-
 .../BucketCache.SharedMemoryBucketEntry.html    |  1270 +-
 .../bucket/BucketCache.StatisticsThread.html    |  1270 +-
 .../hfile/bucket/BucketCache.WriterThread.html  |  1270 +-
 .../hbase/io/hfile/bucket/BucketCache.html      |  1270 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |  1952 +--
 .../hadoop/hbase/regionserver/HStore.html       |  1952 +--
 .../hbase/regionserver/StoreFileReader.html     |   980 +-
 .../hbase/regionserver/StoreFileScanner.html    |   987 +-
 .../hadoop/hbase/wal/WALFactory.Providers.html  |   676 +-
 .../org/apache/hadoop/hbase/wal/WALFactory.html |   676 +-
 downloads.html                                  |     4 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/index-all.html                   |    12 +
 .../client/TestAsyncTableGetMultiThreaded.html  |    40 +-
 .../hbase/io/encoding/TestChangingEncoding.html |    26 +-
 .../TestNamespaceAuditor.CPMasterObserver.html  |    12 +-
 ...NamespaceAuditor.CPRegionServerObserver.html |    14 +-
 .../TestNamespaceAuditor.CustomObserver.html    |    12 +-
 ...TestNamespaceAuditor.MasterSyncObserver.html |    16 +-
 .../hbase/namespace/TestNamespaceAuditor.html   |    54 +-
 .../org/apache/hadoop/hbase/package-tree.html   |     6 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hbase/quotas/TestMasterQuotasObserver.html  |    60 +-
 ...tEndToEndSplitTransaction.RegionChecker.html |    24 +-
 ...EndToEndSplitTransaction.RegionSplitter.html |    22 +-
 .../TestEndToEndSplitTransaction.html           |    76 +-
 .../hbase/regionserver/TestHStoreFile.html      |   100 +-
 ...tTransactionOnCluster.CustomSplitPolicy.html |     8 +-
 ...ionOnCluster.FailingSplitMasterObserver.html |    12 +-
 .../TestSplitTransactionOnCluster.MyMaster.html |     6 +-
 ...ransactionOnCluster.MyMasterRpcServices.html |    10 +-
 .../TestSplitTransactionOnCluster.html          |    72 +-
 .../hadoop/hbase/regionserver/package-tree.html |     6 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 .../TestWALFactory.DumbWALActionsListener.html  |    10 +-
 .../apache/hadoop/hbase/wal/TestWALFactory.html |    96 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../client/TestAsyncTableGetMultiThreaded.html  |   272 +-
 .../hbase/io/encoding/TestChangingEncoding.html |   288 +-
 .../TestNamespaceAuditor.CPMasterObserver.html  |  1376 +-
 ...NamespaceAuditor.CPRegionServerObserver.html |  1376 +-
 .../TestNamespaceAuditor.CustomObserver.html    |  1376 +-
 ...TestNamespaceAuditor.MasterSyncObserver.html |  1376 +-
 .../hbase/namespace/TestNamespaceAuditor.html   |  1376 +-
 .../hbase/quotas/TestMasterQuotasObserver.html  |   263 +-
 ...tEndToEndSplitTransaction.RegionChecker.html |   898 +-
 ...EndToEndSplitTransaction.RegionSplitter.html |   898 +-
 .../TestEndToEndSplitTransaction.html           |   898 +-
 .../hbase/regionserver/TestHStoreFile.html      |  2148 ++--
 ...tTransactionOnCluster.CustomSplitPolicy.html |  1965 +--
 ...ionOnCluster.FailingSplitMasterObserver.html |  1965 +--
 .../TestSplitTransactionOnCluster.MyMaster.html |  1965 +--
 ...ransactionOnCluster.MyMasterRpcServices.html |  1965 +--
 .../TestSplitTransactionOnCluster.html          |  1965 +--
 .../TestWALFactory.DumbWALActionsListener.html  |  1335 +-
 .../apache/hadoop/hbase/wal/TestWALFactory.html |  1335 +-
 128 files changed, 27443 insertions(+), 26534 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index d1abae7..f001453 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index d666bb1..7c208b7 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:20180816142953+00'00')
-/CreationDate (D:20180816144408+00'00')
+/ModDate (D:20180818142958+00'00')
+/CreationDate (D:20180818144423+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 8ab7b70..dedb126 100644
--- a/book.html
+++ b/book.html
@@ -41148,7 +41148,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-08-16 14:29:53 UTC
+Last updated 2018-08-18 14:29:58 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 7cd8408..b26aeac 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="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 


[27/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index 98653f0..3559952 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -1709,1036 +1709,1046 @@
 <span class="sourceLineNo">1701</span><a name="line.1701"></a>
 <span class="sourceLineNo">1702</span>  @Override<a name="line.1702"></a>
 <span class="sourceLineNo">1703</span>  public boolean hasReferences() {<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    return StoreUtils.hasReferences(this.storeEngine.getStoreFileManager().getStorefiles());<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>  }<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span><a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>  /**<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>   * getter for CompactionProgress object<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>   * @return CompactionProgress object; can be null<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>   */<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>  public CompactionProgress getCompactionProgress() {<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    return this.storeEngine.getCompactor().getProgress();<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>  }<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span><a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>  @Override<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  public boolean shouldPerformMajorCompaction() throws IOException {<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>    for (HStoreFile sf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>      // TODO: what are these reader checks all over the place?<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>      if (sf.getReader() == null) {<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>        LOG.debug("StoreFile {} has null Reader", sf);<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>        return false;<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>      }<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    }<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    return storeEngine.getCompactionPolicy().shouldPerformMajorCompaction(<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>        this.storeEngine.getStoreFileManager().getStorefiles());<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>  }<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>  public Optional&lt;CompactionContext&gt; requestCompaction() throws IOException {<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    return requestCompaction(NO_PRIORITY, CompactionLifeCycleTracker.DUMMY, null);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>  }<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span><a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>  public Optional&lt;CompactionContext&gt; requestCompaction(int priority,<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      CompactionLifeCycleTracker tracker, User user) throws IOException {<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // don't even select for compaction if writes are disabled<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    if (!this.areWritesEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>      return Optional.empty();<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    }<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    // Before we do compaction, try to get rid of unneeded files to simplify things.<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    removeUnneededFiles();<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span><a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    final CompactionContext compaction = storeEngine.createCompaction();<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>    CompactionRequestImpl request = null;<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    this.lock.readLock().lock();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    try {<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      synchronized (filesCompacting) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // First, see if coprocessor would want to override selection.<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        if (this.getCoprocessorHost() != null) {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>          final List&lt;HStoreFile&gt; candidatesForCoproc = compaction.preSelect(this.filesCompacting);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>          boolean override = getCoprocessorHost().preCompactSelection(this,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>              candidatesForCoproc, tracker, user);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>          if (override) {<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>            // Coprocessor is overriding normal file selection.<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>            compaction.forceSelect(new CompactionRequestImpl(candidatesForCoproc));<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>          }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>        }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span><a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        // Normal case - coprocessor is not overriding file selection.<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>        if (!compaction.hasSelection()) {<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>          boolean isUserCompaction = priority == Store.PRIORITY_USER;<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>          boolean mayUseOffPeak = offPeakHours.isOffPeakHour() &amp;&amp;<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>              offPeakCompactionTracker.compareAndSet(false, true);<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>          try {<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>            compaction.select(this.filesCompacting, isUserCompaction,<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>              mayUseOffPeak, forceMajor &amp;&amp; filesCompacting.isEmpty());<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>          } catch (IOException e) {<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>            if (mayUseOffPeak) {<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>              offPeakCompactionTracker.set(false);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>            }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>            throw e;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>          }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          assert compaction.hasSelection();<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          if (mayUseOffPeak &amp;&amp; !compaction.getRequest().isOffPeak()) {<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>            // Compaction policy doesn't want to take advantage of off-peak.<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>            offPeakCompactionTracker.set(false);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>          }<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        }<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>        if (this.getCoprocessorHost() != null) {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>          this.getCoprocessorHost().postCompactSelection(<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>              this, ImmutableList.copyOf(compaction.getRequest().getFiles()), tracker,<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>              compaction.getRequest(), user);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>        }<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>        // Finally, we have the resulting files list. Check if we have any files at all.<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        request = compaction.getRequest();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        Collection&lt;HStoreFile&gt; selectedFiles = request.getFiles();<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>        if (selectedFiles.isEmpty()) {<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          return Optional.empty();<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        }<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span><a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>        addToCompactingFiles(selectedFiles);<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        // If we're enqueuing a major, clear the force flag.<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>        this.forceMajor = this.forceMajor &amp;&amp; !request.isMajor();<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span><a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>        // Set common request properties.<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>        // Set priority, either override value supplied by caller or from store.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>        request.setPriority((priority != Store.NO_PRIORITY) ? priority : getCompactPriority());<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>        request.setDescription(getRegionInfo().getRegionNameAsString(), getColumnFamilyName());<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>        request.setTracker(tracker);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      }<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    } finally {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>      this.lock.readLock().unlock();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    }<a name="line.1802"></a>
+<span class="sourceLineNo">1704</span>    List&lt;HStoreFile&gt; reloadedStoreFiles = null;<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    try {<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>      // Reloading the store files from file system due to HBASE-20940. As split can happen with an<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      // region which has references<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>      reloadedStoreFiles = loadStoreFiles();<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      return StoreUtils.hasReferences(reloadedStoreFiles);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    } catch (IOException ioe) {<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>      LOG.error("Error trying to determine if store has references, assuming references exists",<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>        ioe);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>      return true;<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    }<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  /**<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>   * getter for CompactionProgress object<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>   * @return CompactionProgress object; can be null<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>   */<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public CompactionProgress getCompactionProgress() {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    return this.storeEngine.getCompactor().getProgress();<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>  }<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span><a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>  @Override<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>  public boolean shouldPerformMajorCompaction() throws IOException {<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    for (HStoreFile sf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      // TODO: what are these reader checks all over the place?<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      if (sf.getReader() == null) {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        LOG.debug("StoreFile {} has null Reader", sf);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>        return false;<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>      }<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>    return storeEngine.getCompactionPolicy().shouldPerformMajorCompaction(<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>        this.storeEngine.getStoreFileManager().getStorefiles());<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>  }<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span><a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>  public Optional&lt;CompactionContext&gt; requestCompaction() throws IOException {<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    return requestCompaction(NO_PRIORITY, CompactionLifeCycleTracker.DUMMY, null);<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>  }<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span><a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>  public Optional&lt;CompactionContext&gt; requestCompaction(int priority,<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      CompactionLifeCycleTracker tracker, User user) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // don't even select for compaction if writes are disabled<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    if (!this.areWritesEnabled()) {<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>      return Optional.empty();<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    // Before we do compaction, try to get rid of unneeded files to simplify things.<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    removeUnneededFiles();<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span><a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    final CompactionContext compaction = storeEngine.createCompaction();<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    CompactionRequestImpl request = null;<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    this.lock.readLock().lock();<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    try {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>      synchronized (filesCompacting) {<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>        // First, see if coprocessor would want to override selection.<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        if (this.getCoprocessorHost() != null) {<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>          final List&lt;HStoreFile&gt; candidatesForCoproc = compaction.preSelect(this.filesCompacting);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>          boolean override = getCoprocessorHost().preCompactSelection(this,<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>              candidatesForCoproc, tracker, user);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>          if (override) {<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>            // Coprocessor is overriding normal file selection.<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>            compaction.forceSelect(new CompactionRequestImpl(candidatesForCoproc));<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>          }<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>        }<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>        // Normal case - coprocessor is not overriding file selection.<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>        if (!compaction.hasSelection()) {<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>          boolean isUserCompaction = priority == Store.PRIORITY_USER;<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          boolean mayUseOffPeak = offPeakHours.isOffPeakHour() &amp;&amp;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>              offPeakCompactionTracker.compareAndSet(false, true);<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>          try {<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>            compaction.select(this.filesCompacting, isUserCompaction,<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>              mayUseOffPeak, forceMajor &amp;&amp; filesCompacting.isEmpty());<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>          } catch (IOException e) {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>            if (mayUseOffPeak) {<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>              offPeakCompactionTracker.set(false);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>            }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>            throw e;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>          }<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>          assert compaction.hasSelection();<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>          if (mayUseOffPeak &amp;&amp; !compaction.getRequest().isOffPeak()) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>            // Compaction policy doesn't want to take advantage of off-peak.<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            offPeakCompactionTracker.set(false);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>        if (this.getCoprocessorHost() != null) {<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>          this.getCoprocessorHost().postCompactSelection(<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>              this, ImmutableList.copyOf(compaction.getRequest().getFiles()), tracker,<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>              compaction.getRequest(), user);<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        }<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>        // Finally, we have the resulting files list. Check if we have any files at all.<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>        request = compaction.getRequest();<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>        Collection&lt;HStoreFile&gt; selectedFiles = request.getFiles();<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        if (selectedFiles.isEmpty()) {<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>          return Optional.empty();<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>        }<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        addToCompactingFiles(selectedFiles);<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span><a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>        // If we're enqueuing a major, clear the force flag.<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>        this.forceMajor = this.forceMajor &amp;&amp; !request.isMajor();<a name="line.1802"></a>
 <span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>    if (LOG.isDebugEnabled()) {<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      LOG.debug(getRegionInfo().getEncodedName() + " - " + getColumnFamilyName()<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>          + ": Initiating " + (request.isMajor() ? "major" : "minor") + " compaction"<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>          + (request.isAllFiles() ? " (all files)" : ""));<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    this.region.reportCompactionRequestStart(request.isMajor());<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    return Optional.of(compaction);<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>  }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span><a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>  /** Adds the files to compacting files. filesCompacting must be locked. */<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>  private void addToCompactingFiles(Collection&lt;HStoreFile&gt; filesToAdd) {<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    if (CollectionUtils.isEmpty(filesToAdd)) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      return;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    // Check that we do not try to compact the same StoreFile twice.<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    if (!Collections.disjoint(filesCompacting, filesToAdd)) {<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>      Preconditions.checkArgument(false, "%s overlaps with %s", filesToAdd, filesCompacting);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    filesCompacting.addAll(filesToAdd);<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    Collections.sort(filesCompacting, storeEngine.getStoreFileManager().getStoreFileComparator());<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>  }<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span><a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>  private void removeUnneededFiles() throws IOException {<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (!conf.getBoolean("hbase.store.delete.expired.storefile", true)) return;<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    if (getColumnFamilyDescriptor().getMinVersions() &gt; 0) {<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>      LOG.debug("Skipping expired store file removal due to min version being {}",<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>          getColumnFamilyDescriptor().getMinVersions());<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    this.lock.readLock().lock();<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    Collection&lt;HStoreFile&gt; delSfs = null;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    try {<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>      synchronized (filesCompacting) {<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        long cfTtl = getStoreFileTtl();<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>        if (cfTtl != Long.MAX_VALUE) {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>          delSfs = storeEngine.getStoreFileManager().getUnneededFiles(<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>              EnvironmentEdgeManager.currentTime() - cfTtl, filesCompacting);<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>          addToCompactingFiles(delSfs);<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>        }<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      }<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    } finally {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      this.lock.readLock().unlock();<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span><a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    if (CollectionUtils.isEmpty(delSfs)) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return;<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    Collection&lt;HStoreFile&gt; newFiles = Collections.emptyList(); // No new files.<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    writeCompactionWalRecord(delSfs, newFiles);<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    replaceStoreFiles(delSfs, newFiles);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    completeCompaction(delSfs);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    LOG.info("Completed removal of " + delSfs.size() + " unnecessary (expired) file(s) in "<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>        + this + " of " + this.getRegionInfo().getRegionNameAsString()<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>        + "; total size for store is "<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + TraditionalBinaryPrefix.long2String(storeSize.get(), "", 1));<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>  }<a name="line.1860"></a>
+<span class="sourceLineNo">1804</span>        // Set common request properties.<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>        // Set priority, either override value supplied by caller or from store.<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>        request.setPriority((priority != Store.NO_PRIORITY) ? priority : getCompactPriority());<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>        request.setDescription(getRegionInfo().getRegionNameAsString(), getColumnFamilyName());<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        request.setTracker(tracker);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>      }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    } finally {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      this.lock.readLock().unlock();<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span><a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    if (LOG.isDebugEnabled()) {<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>      LOG.debug(getRegionInfo().getEncodedName() + " - " + getColumnFamilyName()<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>          + ": Initiating " + (request.isMajor() ? "major" : "minor") + " compaction"<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>          + (request.isAllFiles() ? " (all files)" : ""));<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    this.region.reportCompactionRequestStart(request.isMajor());<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    return Optional.of(compaction);<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>  }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>  /** Adds the files to compacting files. filesCompacting must be locked. */<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>  private void addToCompactingFiles(Collection&lt;HStoreFile&gt; filesToAdd) {<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (CollectionUtils.isEmpty(filesToAdd)) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    // Check that we do not try to compact the same StoreFile twice.<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    if (!Collections.disjoint(filesCompacting, filesToAdd)) {<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>      Preconditions.checkArgument(false, "%s overlaps with %s", filesToAdd, filesCompacting);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    }<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    filesCompacting.addAll(filesToAdd);<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    Collections.sort(filesCompacting, storeEngine.getStoreFileManager().getStoreFileComparator());<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>  }<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span><a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  private void removeUnneededFiles() throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (!conf.getBoolean("hbase.store.delete.expired.storefile", true)) return;<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    if (getColumnFamilyDescriptor().getMinVersions() &gt; 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      LOG.debug("Skipping expired store file removal due to min version being {}",<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>          getColumnFamilyDescriptor().getMinVersions());<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      return;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    this.lock.readLock().lock();<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    Collection&lt;HStoreFile&gt; delSfs = null;<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    try {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      synchronized (filesCompacting) {<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>        long cfTtl = getStoreFileTtl();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>        if (cfTtl != Long.MAX_VALUE) {<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>          delSfs = storeEngine.getStoreFileManager().getUnneededFiles(<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>              EnvironmentEdgeManager.currentTime() - cfTtl, filesCompacting);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>          addToCompactingFiles(delSfs);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>        }<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>      }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    } finally {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      this.lock.readLock().unlock();<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    }<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    if (CollectionUtils.isEmpty(delSfs)) {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>      return;<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    }<a name="line.1860"></a>
 <span class="sourceLineNo">1861</span><a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>  public void cancelRequestedCompaction(CompactionContext compaction) {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>    finishCompactionRequest(compaction.getRequest());<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>  }<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span><a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>  private void finishCompactionRequest(CompactionRequestImpl cr) {<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    this.region.reportCompactionRequestEnd(cr.isMajor(), cr.getFiles().size(), cr.getSize());<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    if (cr.isOffPeak()) {<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>      offPeakCompactionTracker.set(false);<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>      cr.setOffPeak(false);<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    }<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    synchronized (filesCompacting) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      filesCompacting.removeAll(cr.getFiles());<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>  }<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span><a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  /**<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>   * Validates a store file by opening and closing it. In HFileV2 this should not be an expensive<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>   * operation.<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * @param path the path to the store file<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  private void validateStoreFile(Path path) throws IOException {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    HStoreFile storeFile = null;<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    try {<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>      storeFile = createStoreFileAndReader(path);<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    } catch (IOException e) {<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>      LOG.error("Failed to open store file : {}, keeping it in tmp location", path, e);<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>      throw e;<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    } finally {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>      if (storeFile != null) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>        storeFile.closeStoreFile(false);<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * &lt;p&gt;It works by processing a compaction that's been written to disk.<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   *<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>   * &lt;p&gt;It is usually invoked at the end of a compaction, but might also be<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>   * invoked at HStore startup, if the prior execution died midway through.<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>   *<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>   * &lt;p&gt;Moving the compacted TreeMap into place means:<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>   * &lt;pre&gt;<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * 1) Unload all replaced StoreFile, close and collect list to delete.<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * 2) Compute new store size<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * &lt;/pre&gt;<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   *<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   * @param compactedFiles list of files that were compacted<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>   */<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  @VisibleForTesting<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  protected void completeCompaction(Collection&lt;HStoreFile&gt; compactedFiles)<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    throws IOException {<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    this.storeSize.set(0L);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    this.totalUncompressedBytes.set(0L);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    for (HStoreFile hsf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>      StoreFileReader r = hsf.getReader();<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>      if (r == null) {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>        LOG.warn("StoreFile {} has a null Reader", hsf);<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>        continue;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      this.storeSize.addAndGet(r.length());<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>      this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    }<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /*<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @param wantedVersions How many versions were asked for.<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   * @return wantedVersions or this families' {@link HConstants#VERSIONS}.<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>  int versionsToReturn(final int wantedVersions) {<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    if (wantedVersions &lt;= 0) {<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      throw new IllegalArgumentException("Number of versions must be &gt; 0");<a name="line.1932"></a>
+<span class="sourceLineNo">1862</span>    Collection&lt;HStoreFile&gt; newFiles = Collections.emptyList(); // No new files.<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    writeCompactionWalRecord(delSfs, newFiles);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    replaceStoreFiles(delSfs, newFiles);<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    completeCompaction(delSfs);<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    LOG.info("Completed removal of " + delSfs.size() + " unnecessary (expired) file(s) in "<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>        + this + " of " + this.getRegionInfo().getRegionNameAsString()<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>        + "; total size for store is "<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>        + TraditionalBinaryPrefix.long2String(storeSize.get(), "", 1));<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  public void cancelRequestedCompaction(CompactionContext compaction) {<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    finishCompactionRequest(compaction.getRequest());<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>  private void finishCompactionRequest(CompactionRequestImpl cr) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    this.region.reportCompactionRequestEnd(cr.isMajor(), cr.getFiles().size(), cr.getSize());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    if (cr.isOffPeak()) {<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>      offPeakCompactionTracker.set(false);<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>      cr.setOffPeak(false);<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    synchronized (filesCompacting) {<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>      filesCompacting.removeAll(cr.getFiles());<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    }<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Validates a store file by opening and closing it. In HFileV2 this should not be an expensive<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   * operation.<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>   * @param path the path to the store file<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>   */<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  private void validateStoreFile(Path path) throws IOException {<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    HStoreFile storeFile = null;<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    try {<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>      storeFile = createStoreFileAndReader(path);<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    } catch (IOException e) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>      LOG.error("Failed to open store file : {}, keeping it in tmp location", path, e);<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>      throw e;<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    } finally {<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>      if (storeFile != null) {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>        storeFile.closeStoreFile(false);<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>      }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  }<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span><a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  /**<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * &lt;p&gt;It works by processing a compaction that's been written to disk.<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   *<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * &lt;p&gt;It is usually invoked at the end of a compaction, but might also be<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   * invoked at HStore startup, if the prior execution died midway through.<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>   *<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>   * &lt;p&gt;Moving the compacted TreeMap into place means:<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>   * &lt;pre&gt;<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>   * 1) Unload all replaced StoreFile, close and collect list to delete.<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * 2) Compute new store size<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * &lt;/pre&gt;<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   *<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>   * @param compactedFiles list of files that were compacted<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   */<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  @VisibleForTesting<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>  protected void completeCompaction(Collection&lt;HStoreFile&gt; compactedFiles)<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>    throws IOException {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    this.storeSize.set(0L);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    this.totalUncompressedBytes.set(0L);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    for (HStoreFile hsf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      StoreFileReader r = hsf.getReader();<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>      if (r == null) {<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        LOG.warn("StoreFile {} has a null Reader", hsf);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>      this.storeSize.addAndGet(r.length());<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.1932"></a>
 <span class="sourceLineNo">1933</span>    }<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    // Make sure we do not return more than maximum versions for this store.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>    int maxVersions = this.family.getMaxVersions();<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return wantedVersions &gt; maxVersions ? maxVersions: wantedVersions;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public boolean canSplit() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    this.lock.readLock().lock();<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    try {<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      boolean result = !hasReferences();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (!result) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>      }<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      return result;<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    } finally {<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      this.lock.readLock().unlock();<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    }<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  }<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span><a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>  /**<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>   * Determines if Store should be split.<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>   */<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>  public Optional&lt;byte[]&gt; getSplitPoint() {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>    this.lock.readLock().lock();<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    try {<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      // Should already be enforced by the split policy!<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      assert !this.getRegionInfo().isMetaRegion();<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (hasReferences()) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        return Optional.empty();<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return this.storeEngine.getStoreFileManager().getSplitPoint();<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    } catch(IOException e) {<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      LOG.warn("Failed getting store size for {}", this, e);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    } finally {<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>      this.lock.readLock().unlock();<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    return Optional.empty();<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  }<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span><a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>  @Override<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>  public long getLastCompactSize() {<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    return this.lastCompactSize;<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>  }<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span><a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>  @Override<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>  public long getSize() {<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>    return storeSize.get();<a name="line.1983"></a>
+<span class="sourceLineNo">1934</span>  }<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span><a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  /*<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * @param wantedVersions How many versions were asked for.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   * @return wantedVersions or this families' {@link HConstants#VERSIONS}.<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>   */<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>  int versionsToReturn(final int wantedVersions) {<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    if (wantedVersions &lt;= 0) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>      throw new IllegalArgumentException("Number of versions must be &gt; 0");<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    }<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Make sure we do not return more than maximum versions for this store.<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    int maxVersions = this.family.getMaxVersions();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    return wantedVersions &gt; maxVersions ? maxVersions: wantedVersions;<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>  }<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  @Override<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>  public boolean canSplit() {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    this.lock.readLock().lock();<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    try {<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      boolean result = !hasReferences();<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>      if (!result) {<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      }<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      return result;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>    } finally {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>      this.lock.readLock().unlock();<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>    }<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>  }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>  /**<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>   * Determines if Store should be split.<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>   */<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>  public Optional&lt;byte[]&gt; getSplitPoint() {<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    this.lock.readLock().lock();<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    try {<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      // Should already be enforced by the split policy!<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      assert !this.getRegionInfo().isMetaRegion();<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      if (hasReferences()) {<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>        return Optional.empty();<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      }<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      return this.storeEngine.getStoreFileManager().getSplitPoint();<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    } catch(IOException e) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      LOG.warn("Failed getting store size for {}", this, e);<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    } finally {<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>      this.lock.readLock().unlock();<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>    }<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    return Optional.empty();<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>  }<a name="line.1984"></a>
 <span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>  public void triggerMajorCompaction() {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    this.forceMajor = true;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>  }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span><a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>  // File administration<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span><a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>  /**<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>   * Return a scanner for both the memstore and the HStore files. Assumes we are not in a<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>   * compaction.<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>   * @param scan Scan to apply when scanning the stores<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>   * @param targetCols columns to scan<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>   * @return a scanner over the current key values<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>   * @throws IOException on failure<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>   */<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>  public KeyValueScanner getScanner(Scan scan, final NavigableSet&lt;byte[]&gt; targetCols, long readPt)<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>      throws IOException {<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    lock.readLock().lock();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    try {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>      ScanInfo scanInfo;<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>      if (this.getCoprocessorHost() != null) {<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>        scanInfo = this.getCoprocessorHost().preStoreScannerOpen(this);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>      } else {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>        scanInfo = getScanInfo();<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>      return createScanner(scan, scanInfo, targetCols, readPt);<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>    } finally {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      lock.readLock().unlock();<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>    }<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>  }<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span><a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  // HMobStore will override this method to return its own implementation.<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>  protected KeyValueScanner createScanner(Scan scan, ScanInfo scanInfo,<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      NavigableSet&lt;byte[]&gt; targetCols, long readPt) throws IOException {<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    return scan.isReversed() ? new ReversedStoreScanner(this, scanInfo, scan, targetCols, readPt)<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>        : new StoreScanner(this, scanInfo, scan, targetCols, readPt);<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>  }<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span><a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>  /**<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>   * Recreates the scanners on the current list of active store file scanners<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>   * @param currentFileScanners the current set of active store file scanners<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>   * @param cacheBlocks cache the blocks or not<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>   * @param usePread use pread or not<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>   * @param isCompaction is the scanner for compaction<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * @param matcher the scan query matcher<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   * @param startRow the scan's start row<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>   * @param includeStartRow should the scan include the start row<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>   * @param stopRow the scan's stop row<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>   * @param includeStopRow should the scan include the stop row<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>   * @param readPt the read point of the current scane<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>   * @param includeMemstoreScanner whether the current scanner should include memstorescanner<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * @return list of scanners recreated on the current Scanners<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   * @throws IOException<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>   */<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>  public List&lt;KeyValueScanner&gt; recreateScanners(List&lt;KeyValueScanner&gt; currentFileScanners,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, ScanQueryMatcher matcher,<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>      byte[] startRow, boolean includeStartRow, byte[] stopRow, boolean includeStopRow, long readPt,<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      boolean includeMemstoreScanner) throws IOException {<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    this.lock.readLock().lock();<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    try {<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      Map&lt;String, HStoreFile&gt; name2File =<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>          new HashMap&lt;&gt;(getStorefilesCount() + getCompactedFilesCount());<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>      for (HStoreFile file : getStorefiles()) {<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>      Collection&lt;HStoreFile&gt; compactedFiles = getCompactedFiles();<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      for (HStoreFile file : IterableUtils.emptyIfNull(compactedFiles)) {<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>      }<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>      List&lt;HStoreFile&gt; filesToReopen = new ArrayList&lt;&gt;();<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      for (KeyValueScanner kvs : currentFileScanners) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>        assert kvs.isFileScanner();<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>        if (kvs.peek() == null) {<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>          continue;<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        }<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        filesToReopen.add(name2File.get(kvs.getFilePath().getName()));<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>      if (filesToReopen.isEmpty()) {<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        return null;<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      }<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>      return getScanners(filesToReopen, cacheBlocks, false, false, matcher, startRow,<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        includeStartRow, stopRow, includeStopRow, readPt, false);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    } finally {<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>      this.lock.readLock().unlock();<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    }<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  @Override<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>  public String toString() {<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>    return this.getColumnFamilyName();<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  }<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span><a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  @Override<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>  public int getStorefilesCount() {<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>    return this.storeEngine.getStoreFileManager().getStorefileCount();<a name="line.2081"></a>
+<span class="sourceLineNo">1986</span>  @Override<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>  public long getLastCompactSize() {<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    return this.lastCompactSize;<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>  }<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span><a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>  @Override<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>  public long getSize() {<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    return storeSize.get();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>  }<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span><a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  public void triggerMajorCompaction() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    this.forceMajor = true;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>  // File administration<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span><a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>  /**<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>   * Return a scanner for both the memstore and the HStore files. Assumes we are not in a<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>   * compaction.<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>   * @param scan Scan to apply when scanning the stores<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>   * @param targetCols columns to scan<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>   * @return a scanner over the current key values<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>   * @throws IOException on failure<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   */<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>  public KeyValueScanner getScanner(Scan scan, final NavigableSet&lt;byte[]&gt; targetCols, long readPt)<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      throws IOException {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>    lock.readLock().lock();<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    try {<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      ScanInfo scanInfo;<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>      if (this.getCoprocessorHost() != null) {<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>        scanInfo = this.getCoprocessorHost().preStoreScannerOpen(this);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      } else {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        scanInfo = getScanInfo();<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      return createScanner(scan, scanInfo, targetCols, readPt);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>    } finally {<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      lock.readLock().unlock();<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span><a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>  // HMobStore will override this method to return its own implementation.<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  protected KeyValueScanner createScanner(Scan scan, ScanInfo scanInfo,<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      NavigableSet&lt;byte[]&gt; targetCols, long readPt) throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    return scan.isReversed() ? new ReversedStoreScanner(this, scanInfo, scan, targetCols, readPt)<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        : new StoreScanner(this, scanInfo, scan, targetCols, readPt);<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  }<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span><a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>  /**<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>   * Recreates the scanners on the current list of active store file scanners<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>   * @param currentFileScanners the current set of active store file scanners<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>   * @param cacheBlocks cache the blocks or not<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>   * @param usePread use pread or not<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>   * @param isCompaction is the scanner for compaction<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>   * @param matcher the scan query matcher<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * @param startRow the scan's start row<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   * @param includeStartRow should the scan include the start row<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>   * @param stopRow the scan's stop row<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>   * @param includeStopRow should the scan include the stop row<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>   * @param readPt the read point of the current scane<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>   * @param includeMemstoreScanner whether the current scanner should include memstorescanner<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>   * @return list of scanners recreated on the current Scanners<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>   * @throws IOException<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>   */<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>  public List&lt;KeyValueScanner&gt; recreateScanners(List&lt;KeyValueScanner&gt; currentFileScanners,<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, ScanQueryMatcher matcher,<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      byte[] startRow, boolean includeStartRow, byte[] stopRow, boolean includeStopRow, long readPt,<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>      boolean includeMemstoreScanner) throws IOException {<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    this.lock.readLock().lock();<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    try {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>      Map&lt;String, HStoreFile&gt; name2File =<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>          new HashMap&lt;&gt;(getStorefilesCount() + getCompactedFilesCount());<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      for (HStoreFile file : getStorefiles()) {<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      }<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      Collection&lt;HStoreFile&gt; compactedFiles = getCompactedFiles();<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>      for (HStoreFile file : IterableUtils.emptyIfNull(compactedFiles)) {<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>      List&lt;HStoreFile&gt; filesToReopen = new ArrayList&lt;&gt;();<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      for (KeyValueScanner kvs : currentFileScanners) {<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>        assert kvs.isFileScanner();<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        if (kvs.peek() == null) {<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>          continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>        }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>        filesToReopen.add(name2File.get(kvs.getFilePath().getName()));<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      }<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (filesToReopen.isEmpty()) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        return null;<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>      }<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      return getScanners(filesToReopen, cacheBlocks, false, false, matcher, startRow,<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>        includeStartRow, stopRow, includeStopRow, readPt, false);<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    } finally {<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      this.lock.readLock().unlock();<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    }<a name="line.2081"></a>
 <span class="sourceLineNo">2082</span>  }<a name="line.2082"></a>
 <span class="sourceLineNo">2083</span><a name="line.2083"></a>
 <span class="sourceLineNo">2084</span>  @Override<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>  public int getCompactedFilesCount() {<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    return this.storeEngine.getStoreFileManager().getCompactedFilesCount();<a name="line.2086"></a>
+<span class="sourceLineNo">2085</span>  public String toString() {<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    return this.getColumnFamilyName();<a name="line.2086"></a>
 <span class="sourceLineNo">2087</span>  }<a name="line.2087"></a>
 <span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>  private LongStream getStoreFileAgeStream() {<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>      if (sf.getReader() == null) {<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>        return false;<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>      } else {<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        return true;<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>      }<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    }).filter(HStoreFile::isHFile).mapToLong(sf -&gt; sf.getFileInfo().getCreatedTimestamp())<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        .map(t -&gt; EnvironmentEdgeManager.currentTime() - t);<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  @Override<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  public OptionalLong getMaxStoreFileAge() {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>    return getStoreFileAgeStream().max();<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>  }<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span><a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>  @Override<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>  public OptionalLong getMinStoreFileAge() {<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>    return getStoreFileAgeStream().min();<a name="line.2108"></a>
+<span class="sourceLineNo">2089</span>  @Override<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>  public int getStorefilesCount() {<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    return this.storeEngine.getStoreFileManager().getStorefileCount();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>  }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>  @Override<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>  public int getCompactedFilesCount() {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    return this.storeEngine.getStoreFileManager().getCompactedFilesCount();<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span><a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>  private LongStream getStoreFileAgeStream() {<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      if (sf.getReader() == null) {<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>        return false;<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      } else {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        return true;<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>      }<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    }).filter(HStoreFile::isHFile).mapToLong(sf -&gt; sf.getFileInfo().getCreatedTimestamp())<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>        .map(t -&gt; EnvironmentEdgeManager.currentTime() - t);<a name="line.2108"></a>
 <span class="sourceLineNo">2109</span>  }<a name="line.2109"></a>
 <span class="sourceLineNo">2110</span><a name="line.2110"></a>
 <span class="sourceLineNo">2111</span>  @Override<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>  public OptionalDouble getAvgStoreFileAge() {<a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    return getStoreFileAgeStream().average();<a name="line.2113"></a>
+<span class="sourceLineNo">2112</span>  public OptionalLong getMaxStoreFileAge() {<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>    return getStoreFileAgeStream().max();<a name="line.2113"></a>
 <span class="sourceLineNo">2114</span>  }<a name="line.2114"></a>
 <span class="sourceLineNo">2115</span><a name="line.2115"></a>
 <span class="sourceLineNo">2116</span>  @Override<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>  public long getNumReferenceFiles() {<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream()<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>        .filter(HStoreFile::isReference).count();<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>  }<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>  @Override<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>  public long getNumHFiles() {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream()<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>        .filter(HStoreFile::isHFile).count();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Override<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public long getStoreSizeUncompressed() {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    return this.totalUncompressedBytes.get();<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>  }<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span><a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>  @Override<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>  public long getStorefilesSize() {<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>    // Include all StoreFiles<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    return getStorefilesSize(storeFile -&gt; true);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>  }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>  @Override<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>  public long getHFilesSize() {<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // Include only StoreFiles which are HFiles<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    return getStorefilesSize(storeFile -&gt; storeFile.isHFile());<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>  }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span><a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  private long getStorefilesSize(Predicate&lt;HStoreFile&gt; predicate) {<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>      if (sf.getReader() == null) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        return false;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      } else {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>        return true;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      }<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    }).filter(predicate).mapToLong(sf -&gt; sf.getReader().length()).sum();<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>  }<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span><a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>  private long getStoreFileFieldSize(ToLongFunction&lt;StoreFileReader&gt; f) {<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      if (sf.getReader() == null) {<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>        return false;<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      } else {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>        return true;<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>      }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    }).map(HStoreFile::getReader).mapToLong(f).sum();<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>  public long getStorefilesRootLevelIndexSize() {<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    return getStoreFileFieldSize(StoreFileReader::indexSize);<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>  }<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span><a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>  @Override<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>  public long getTotalStaticIndexSize() {<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    return getStoreFileFieldSize(StoreFileReader::getUncompressedDataIndexSize);<a name="line.2174"></a>
+<span class="sourceLineNo">2117</span>  public OptionalLong getMinStoreFileAge() {<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    return getStoreFileAgeStream().min();<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>  }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>  @Override<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>  public OptionalDouble getAvgStoreFileAge() {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    return getStoreFileAgeStream().average();<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>  }<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span><a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>  @Override<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  public long getNumReferenceFiles() {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream()<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        .filter(HStoreFile::isReference).count();<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  }<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span><a name="line.2131"></a>
+

<TRUNCATED>

[06/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
index a369370..295a1d4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
@@ -39,989 +39,1006 @@
 <span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.Optional;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.ServerName;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Get;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Put;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Table;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.zookeeper.KeeperException;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.After;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.junit.AfterClass;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.junit.Assert;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.junit.Before;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.junit.BeforeClass;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.junit.ClassRule;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.junit.Rule;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.junit.Test;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.junit.experimental.categories.Category;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.junit.rules.TestName;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.slf4j.Logger;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.slf4j.LoggerFactory;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * The below tests are testing split region against a running cluster<a name="line.113"></a>
-<span class="sourceLineNo">114</span> */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.115"></a>
-<span class="sourceLineNo">116</span>@SuppressWarnings("deprecation")<a name="line.116"></a>
-<span class="sourceLineNo">117</span>public class TestSplitTransactionOnCluster {<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @ClassRule<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private Admin admin = null;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private MiniHBaseCluster cluster = null;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static final int NB_SERVERS = 3;<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    new HBaseTestingUtility();<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  @Rule<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  public TestName name = new TestName();<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @BeforeClass public static void before() throws Exception {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  @AfterClass public static void after() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TESTING_UTIL.shutdownMiniCluster();<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>  @Before public void setup() throws IOException {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  @After<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  public void tearDown() throws Exception {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    this.admin.close();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      TESTING_UTIL.deleteTable(htd.getTableName());<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>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throws IOException, InterruptedException {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(1, regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    try {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchProcedureException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return hri;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private void requestSplitRegion(<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      final HRegionServer rsServer,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      final Region region,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      final byte[] midKey) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testRITStateForRollback() throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    final HMaster master = cluster.getMaster();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      // Create table then get the single region for our new table.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      insertData(tableName, admin, t);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      t.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      this.admin.setBalancerRunning(false, true);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      master.setCatalogJanitorEnabled(false);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // find a splittable region<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      final HRegion region = findSplittableRegion(regions);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // install master co-processor to fail splits<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      master.getMasterCoprocessorHost().load(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        FailingSplitMasterObserver.class,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        Coprocessor.PRIORITY_USER,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        master.getConfiguration());<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // split async<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      FailingSplitMasterObserver observer =<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      assertNotNull(observer);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      observer.latch.await();<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        Threads.sleep(100);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      admin.setBalancerRunning(true, false);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      master.setCatalogJanitorEnabled(true);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      abortAndWaitForMaster();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      TESTING_UTIL.deleteTable(tableName);<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  @Test<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // Create table then get the single region for our new table.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    admin.createTable(htd);<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Thread.sleep(100);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    HStore store = region.getStore(cf);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // insert data<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    insertData(tableName, admin, t);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    insertData(tableName, admin, t);<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int fileNum = store.getStorefiles().size();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // 0, Compaction Request<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    store.triggerMajorCompaction();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertTrue(cc.isPresent());<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // 1, A timeout split<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    // 1.1 close region<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // 1.2 rollback and Region initialize again<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    region.initialize();<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // 2, Run Compaction cc<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // 3, Split<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    volatile CountDownLatch latch;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      latch = new CountDownLatch(1);<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>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return Optional.of(this);<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>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void preSplitRegionBeforeMETAAction(<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        final byte[] splitKey,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      latch.countDown();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      throw new IOException("Causing rollback of region split");<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><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  @Test<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    // Create table then get the single region for our new table.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.305"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.conf.Configuration;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.FileSystem;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.fs.Path;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.ServerName;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Get;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Put;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Result;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Table;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.zookeeper.KeeperException;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.junit.After;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.junit.AfterClass;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.junit.Assert;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.junit.Before;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.junit.BeforeClass;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.junit.ClassRule;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.junit.Rule;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.junit.Test;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.junit.experimental.categories.Category;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.junit.rules.TestName;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.slf4j.Logger;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.slf4j.LoggerFactory;<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> * The below tests are testing split region against a running cluster<a name="line.115"></a>
+<span class="sourceLineNo">116</span> */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.117"></a>
+<span class="sourceLineNo">118</span>@SuppressWarnings("deprecation")<a name="line.118"></a>
+<span class="sourceLineNo">119</span>public class TestSplitTransactionOnCluster {<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  @ClassRule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private Admin admin = null;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private MiniHBaseCluster cluster = null;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static final int NB_SERVERS = 3;<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    new HBaseTestingUtility();<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Rule<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public TestName name = new TestName();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @BeforeClass public static void before() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @AfterClass public static void after() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    TESTING_UTIL.shutdownMiniCluster();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Before public void setup() throws IOException {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @After<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public void tearDown() throws Exception {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    this.admin.close();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      TESTING_UTIL.deleteTable(htd.getTableName());<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      throws IOException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertEquals(1, regions.size());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    try {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    } catch (NoSuchProcedureException e) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return hri;<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>  private void requestSplitRegion(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      final HRegionServer rsServer,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      final Region region,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      final byte[] midKey) throws IOException {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<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>  @Test<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  public void testRITStateForRollback() throws Exception {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    final HMaster master = cluster.getMaster();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      // Create table then get the single region for our new table.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      insertData(tableName, admin, t);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      t.close();<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      this.admin.setBalancerRunning(false, true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      master.setCatalogJanitorEnabled(false);<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // find a splittable region<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      final HRegion region = findSplittableRegion(regions);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>      // install master co-processor to fail splits<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      master.getMasterCoprocessorHost().load(<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        FailingSplitMasterObserver.class,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        Coprocessor.PRIORITY_USER,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        master.getConfiguration());<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // split async<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FailingSplitMasterObserver observer =<a name="line.213"></a>
+<span class="sourceLineNo">214</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      assertNotNull(observer);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      observer.latch.await();<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        Threads.sleep(100);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } finally {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      admin.setBalancerRunning(true, false);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      master.setCatalogJanitorEnabled(true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      abortAndWaitForMaster();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      TESTING_UTIL.deleteTable(tableName);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  @Test<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // Create table then get the single region for our new table.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    admin.createTable(htd);<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      Thread.sleep(100);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    HStore store = region.getStore(cf);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // insert data<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    insertData(tableName, admin, t);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    insertData(tableName, admin, t);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    int fileNum = store.getStorefiles().size();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // 0, Compaction Request<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    store.triggerMajorCompaction();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    assertTrue(cc.isPresent());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // 1, A timeout split<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // 1.1 close region<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // 1.2 rollback and Region initialize again<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    region.initialize();<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // 2, Run Compaction cc<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // 3, Split<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    volatile CountDownLatch latch;<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    @Override<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      latch = new CountDownLatch(1);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return Optional.of(this);<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>    @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    public void preSplitRegionBeforeMETAAction(<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        final byte[] splitKey,<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      latch.countDown();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      throw new IOException("Causing rollback of region split");<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // Create table then get the single region for our new table.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.305"></a>
 <span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.307"></a>
+<span class="sourceLineNo">307</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.307"></a>
 <span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.admin.setBalancerRunning(false, true);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // Add a bit of load up into the table so splittable.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Get region pre-split.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      printOutRegions(server, "Initial regions: ");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // rollback.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // split transaction. Catch the exception instead.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      try {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        fail();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      } catch (DoNotRetryRegionException e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        // Expected<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Wait around a while and assert count of regions remains constant.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        Thread.sleep(100);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // Now try splitting and it should work.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      split(hri, server, regionCount);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      // Get daughters<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      checkAndGetDaughters(tableName);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      // OK, so split happened after we cleared the blocking node.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    } finally {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      admin.setBalancerRunning(true, false);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      t.close();<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><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @throws IOException<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @throws InterruptedException<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  @Test<a name="line.356"></a>
-<span class="sourceLineNo">357</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Create table then get the single region for our new table.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.365"></a>
+<span class="sourceLineNo">309</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    this.admin.setBalancerRunning(false, true);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Add a bit of load up into the table so splittable.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // Get region pre-split.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      printOutRegions(server, "Initial regions: ");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // rollback.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      // split transaction. Catch the exception instead.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        fail();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      } catch (DoNotRetryRegionException e) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        // Expected<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // Wait around a while and assert count of regions remains constant.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        Thread.sleep(100);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      // Now try splitting and it should work.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      split(hri, server, regionCount);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      // Get daughters<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      checkAndGetDaughters(tableName);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      // OK, so split happened after we cleared the blocking node.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } finally {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      admin.setBalancerRunning(true, false);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      t.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<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>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @throws IOException<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @throws InterruptedException<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  @Test<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // Create table then get the single region for our new table.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.365"></a>
 <span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    this.admin.setBalancerRunning(false, true);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    try {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      // Add a bit of load up into the table so splittable.<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Get region pre-split.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      printOutRegions(server, "Initial regions: ");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      // Now split.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      split(hri, server, regionCount);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      // Get daughters<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // Now split one of the daughters.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      RegionInfo daughter = daughters.get(0).getRegionInfo();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.info("Daughter we are going to split: " + daughter);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Compact first to ensure we have cleaned up references -- else the split<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // will fail.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      this.admin.compactRegion(daughter.getRegionName());<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      daughters = cluster.getRegions(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      HRegion daughterRegion = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      for (HRegion r: daughters) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        if (RegionInfo.COMPARATOR.compare(r.getRegionInfo(), daughter) == 0) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          daughterRegion = r;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          LOG.info("Found matching HRI: " + daughterRegion);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          break;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      assertTrue(daughterRegion != null);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      for (int i=0; i&lt;100; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        if (!daughterRegion.hasReferences()) break;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Threads.sleep(100);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      assertFalse("Waiting for reference to be compacted", daughterRegion.hasReferences());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      LOG.info("Daughter hri before split (has been compacted): " + daughter);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      split(daughter, server, regionCount);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // Get list of daughters<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      daughters = cluster.getRegions(tableName);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      for (HRegion d: daughters) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        LOG.info("Regions before crash: " + d);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Now crash the server<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      cluster.abortRegionServer(tableRegionIndex);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      waitUntilRegionServerDead();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      awaitDaughters(tableName, daughters.size());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      // Assert daughters are online and ONLY the original daughters -- that<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      // fixup didn't insert one during server shutdown recover.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      regions = cluster.getRegions(tableName);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      for (HRegion d: daughters) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        LOG.info("Regions after crash: " + d);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (daughters.size() != regions.size()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        LOG.info("Daughters=" + daughters.size() + ", regions=" + regions.size());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      assertEquals(daughters.size(), regions.size());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      for (HRegion r: regions) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        LOG.info("Regions post crash " + r + ", contains=" + daughters.contains(r));<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        assertTrue("Missing region post crash " + r, daughters.contains(r));<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      LOG.info("EXITING");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      admin.setBalancerRunning(true, false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      t.close();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @Test<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles() throws Exception {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    TableName userTableName = TableName.valueOf(name.getMethodName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    HTableDescriptor htd = new HTableDescriptor(userTableName);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    HColumnDescriptor hcd = new HColumnDescriptor("col");<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    htd.addFamily(hcd);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    admin.createTable(htd);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    Table table = TESTING_UTIL.getConnection().getTable(userTableName);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      for (int i = 0; i &lt;= 5; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        String row = "row" + i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Put p = new Put(row.getBytes());<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        String val = "Val" + i;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        p.addColumn("col".getBytes(), "ql".getBytes(), val.getBytes());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        table.put(p);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        admin.flush(userTableName);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        Delete d = new Delete(row.getBytes());<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        // Do a normal delete<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        table.delete(d);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        admin.flush(userTableName);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      admin.majorCompact(userTableName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      List&lt;RegionInfo&gt; regionsOfTable =<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          cluster.getMaster().getAssignmentManager().getRegionStates()<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          .getRegionsOfTable(userTableName);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(1, regionsOfTable.size());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      RegionInfo hRegionInfo = regionsOfTable.get(0);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      Put p = new Put("row6".getBytes());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      table.put(p);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      p = new Put("row7".getBytes());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      table.put(p);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      p = new Put("row8".getBytes());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      table.put(p);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      admin.flush(userTableName);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      admin.splitRegion(hRegionInfo.getRegionName(), "row7".getBytes());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      regionsOfTable = cluster.getMaster()<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          .getAssignmentManager().getRegionStates()<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .getRegionsOfTable(userTableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      while (regionsOfTable.size() != 2) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        Thread.sleep(1000);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        regionsOfTable = cluster.getMaster()<a name="line.481"></a>
-<span class="sourceLineNo">482</span>            .getAssignmentManager().getRegionStates()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>            .getRegionsOfTable(userTableName);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.debug("waiting 2 regions to be available, got " + regionsOfTable.size() +<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          ": " + regionsOfTable);<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>      }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      Assert.assertEquals(2, regionsOfTable.size());<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      Scan s = new Scan();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      ResultScanner scanner = table.getScanner(s);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      int mainTableCount = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        mainTableCount++;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      Assert.assertEquals(3, mainTableCount);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    } finally {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      table.close();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * Verifies HBASE-5806.  Here the case is that splitting is completed but before the<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * CJ could remove the parent region the master is killed and restarted.<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @throws IOException<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   * @throws InterruptedException<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @throws NodeExistsException<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @throws KeeperException<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  @Test<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  public void testMasterRestartAtRegionSplitPendingCatalogJanitor()<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      throws IOException, InterruptedException, NodeExistsException,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      KeeperException, ServiceException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    // Create table then get the single region for our new table.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    this.admin.setBalancerRunning(false, true);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Add a bit of load up into the table so splittable.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      // Get region pre-split.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      printOutRegions(server, "Initial regions: ");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Call split.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      this.admin.splitRegion(hri.getRegionName());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // Before cleanup, get a new master.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      HMaster master = abortAndWaitForMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      // Now call compact on the daughters and clean up any references.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      for (HRegion daughter: daughters) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        daughter.compact(true);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        assertFalse(daughter.hasReferences());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      // BUT calling compact on the daughters is not enough. The CatalogJanitor looks<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      // in the filesystem, and the filesystem content is not same as what the Region<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      // is reading from. Compacted-away files are picked up later by the compacted<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      // file discharger process. It runs infrequently. Make it run so CatalogJanitor<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      // doens't find any references.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      for (RegionServerThread rst: cluster.getRegionServerThreads()) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>        boolean oldSetting = rst.getRegionServer().compactedFileDischarger.setUseExecutor(false);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        rst.getRegionServer().compactedFileDischarger.run();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        rst.getRegionServer().compactedFileDischarger.setUseExecutor(oldSetting);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      LOG.info("Starting run of CatalogJanitor");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      cluster.getMaster().getCatalogJanitor().run();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      ProcedureTestingUtility.waitAllProcedures(cluster.getMaster().getMasterProcedureExecutor

<TRUNCATED>

[34/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
index 794e33b..3ec9a39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntry.html
@@ -1089,640 +1089,642 @@
 <span class="sourceLineNo">1081</span>  /**<a name="line.1081"></a>
 <span class="sourceLineNo">1082</span>   * @see #retrieveFromFile(int[])<a name="line.1082"></a>
 <span class="sourceLineNo">1083</span>   */<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  private void persistToFile() throws IOException {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    assert !cacheEnabled;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    if (!ioEngine.isPersistent()) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>  }<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>   * @see #persistToFile()<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>   */<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    File persistenceFile = new File(persistencePath);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (!persistenceFile.exists()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      return;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    assert !cacheEnabled;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      byte[] pbuf = new byte[pblen];<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      int read = in.read(pbuf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      if (read != pblen) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            persistencePath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  /**<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>   * &lt;pre&gt;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   *   File f = ...<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   *     // use the input stream<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   *   } finally {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   *   }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * &lt;/pre&gt;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * @param file the file to read and delete<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @return a FileInputStream for the given file<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @throws IOException if there is a problem creating the stream<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return new FileInputStream(file) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      public void close() throws IOException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        super.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (!file.delete()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    };<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      throws IOException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (capacitySize != cacheCapacity) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>  }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span><a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>  /**<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>   * cache<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   */<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>  private void checkIOErrorIsTolerated() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        disableCache();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    } else {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      this.ioErrorStartTime = now;<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>  /**<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   */<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>  private void disableCache() {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    if (!cacheEnabled) return;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    cacheEnabled = false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    ioEngine.shutdown();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    this.scheduleThreadPool.shutdown();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    this.ramCache.clear();<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.backingMap.clear();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  private void join() throws InterruptedException {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      writerThreads[i].join();<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  @Override<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  public void shutdown() {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    disableCache();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        + "; path to write=" + persistencePath);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        join();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>        persistToFile();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      } catch (IOException ex) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      } catch (InterruptedException e) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      }<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span><a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  public CacheStats getStats() {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    return cacheStats;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>  public BucketAllocator getAllocator() {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    return this.bucketAllocator;<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>  @Override<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public long heapSize() {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    return this.heapSize.sum();<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public long size() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return this.realCacheSize.sum();<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  @Override<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  public long getCurrentDataSize() {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    return size();<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  }<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>  @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>  public long getFreeSize() {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return this.bucketAllocator.getFreeSize();<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  public long getBlockCount() {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    return this.blockNumber.sum();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>  @Override<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  public long getDataBlockCount() {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    return getBlockCount();<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>  }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  @Override<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  public long getCurrentSize() {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    return this.bucketAllocator.getUsedSize();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  }<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>   * Evicts all blocks for a specific HFile.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * &lt;p&gt;<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   *<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * @return the number of blocks evicted<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    int numEvicted = 0;<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    for (BlockCacheKey key : keySet) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      if (evictBlock(key)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          ++numEvicted;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    return numEvicted;<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>  /**<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>   */<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  static class BucketEntry implements Serializable {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // access counter comparator, descending order<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    private int offsetBase;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    private int length;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private byte offset1;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    /**<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>     */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    byte deserialiserIndex;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    private volatile long accessCounter;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    private BlockPriority priority;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>     */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    private final long cachedTime = System.nanoTime();<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      setOffset(offset);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      this.length = length;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      this.accessCounter = accessCounter;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      if (inMemory) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        this.priority = BlockPriority.MEMORY;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.SINGLE;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    long offset() { // Java has no unsigned numbers<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return o &lt;&lt; 8;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private void setOffset(long value) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      assert (value &amp; 0xFF) == 0;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      value &gt;&gt;= 8;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      offsetBase = (int) value;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    public int getLength() {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return length;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span><a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<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>    public long getAccessCounter() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      return accessCounter;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span><a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    /**<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>     * Block has been accessed. Update its local access counter.<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>     */<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    public void access(long accessCounter) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      this.accessCounter = accessCounter;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        this.priority = BlockPriority.MULTI;<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><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    public BlockPriority getPriority() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return this.priority;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    public long getCachedTime() {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      return cachedTime;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    protected int getRefCount() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return 0;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    protected int incrementRefCountAndGet() {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      return 0;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span><a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    protected int decrementRefCountAndGet() {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    protected boolean isMarkedForEvict() {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      return false;<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    protected void markForEvict() {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      // noop;<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  static class SharedMemoryBucketEntry extends BucketEntry {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    private static final long serialVersionUID = -2187147283772338481L;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Set this when we were not able to forcefully evict the block<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    private volatile boolean markedForEvict;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    private AtomicInteger refCount = new AtomicInteger(0);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    SharedMemoryBucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      super(offset, length, accessCounter, inMemory);<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    @Override<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    protected int getRefCount() {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      return this.refCount.get();<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    @Override<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    protected int incrementRefCountAndGet() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      return this.refCount.incrementAndGet();<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>    @Override<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    protected int decrementRefCountAndGet() {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      return this.refCount.decrementAndGet();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    @Override<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    protected boolean isMarkedForEvict() {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      return this.markedForEvict;<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    @Override<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    protected void markForEvict() {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      this.markedForEvict = true;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  /**<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   * according to configuration parameters and their relative sizes.<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   */<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  private class BucketEntryGroup {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    private CachedEntryQueue queue;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    private long totalSize = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    private long bucketSize;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      this.bucketSize = bucketSize;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      totalSize = 0;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span><a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      totalSize += block.getValue().getLength();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      queue.add(block);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    public long free(long toFree) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>      long freedBytes = 0;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        if (evictBlock(entry.getKey(), false)) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          freedBytes += entry.getValue().getLength();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        }<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (freedBytes &gt;= toFree) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          return freedBytes;<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      }<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      return freedBytes;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    public long overflow() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      return totalSize - bucketSize;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span><a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    public long totalSize() {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      return totalSize;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span><a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  /**<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>   */<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  @VisibleForTesting<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>  static class RAMQueueEntry {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private BlockCacheKey key;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    private Cacheable data;<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    private long accessCounter;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    private boolean inMemory;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    public RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        boolean inMemory) {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>      this.key = bck;<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      this.data = data;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      this.accessCounter = accessCounter;<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>      this.inMemory = inMemory;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    public Cacheable getData() {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      return data;<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span><a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    public BlockCacheKey getKey() {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return key;<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    public void access(long accessCounter) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      this.accessCounter = accessCounter;<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    public BucketEntry writeToCache(final IOEngine ioEngine,<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        final BucketAllocator bucketAllocator,<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>        final LongAdder realCacheSize) throws CacheFullException, IOException,<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        BucketAllocatorException {<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      int len = data.getSerializedLength();<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      // This cacheable thing can't be serialized<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      if (len == 0) return null;<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      long offset = bucketAllocator.allocateBlock(len);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      BucketEntry bucketEntry = ioEngine.usesSharedMemory()<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>          ? UnsafeAvailChecker.isAvailable()<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>              ? new UnsafeSharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>              : new SharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          : new BucketEntry(offset, len, accessCounter, inMemory);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      bucketEntry.setDeserialiserReference(data.getDeserializer());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      try {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>        if (data instanceof HFileBlock) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>          HFileBlock block = (HFileBlock)data;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          if (LOG.isTraceEnabled()) {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>            LOG.trace("Write offset=" + offset + ", len=" + len);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>          }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>          ioEngine.write(sliceBuf, offset);<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>        } else {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>          data.serialize(bb, true);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>          ioEngine.write(bb, offset);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      } catch (IOException ioe) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        // free it in bucket allocator<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>        bucketAllocator.freeBlock(offset);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw ioe;<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      realCacheSize.add(len);<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      return bucketEntry;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    }<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  /**<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * Only used in test<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @throws InterruptedException<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   */<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      writerThread.disableWriter();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      writerThread.interrupt();<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      writerThread.join();<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>  }<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span><a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        this.backingMap.entrySet().iterator();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      private final long now = System.nanoTime();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      @Override<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      public boolean hasNext() {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>        return i.hasNext();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      @Override<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      public CachedBlock next() {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>        return new CachedBlock() {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>          @Override<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>          public String toString() {<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>            return BlockCacheUtil.toString(this, now);<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>          public BlockPriority getBlockPriority() {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            return e.getValue().getPriority();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>          }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          @Override<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>          public BlockType getBlockType() {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return null;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public long getOffset() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().getOffset();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public long getSize() {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            return e.getValue().getLength();<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          }<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>          @Override<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>          public long getCachedTime() {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            return e.getValue().getCachedTime();<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          public String getFilename() {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>            return e.getKey().getHfileName();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>          public int compareTo(CachedBlock other) {<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>            if (diff != 0) return diff;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span><a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            if (diff != 0) return diff;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>                other.getCachedTime());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>            }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span><a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          @Override<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>          public int hashCode() {<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            return e.getKey().hashCode();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          }<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>          @Override<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          public boolean equals(Object obj) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            if (obj instanceof CachedBlock) {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              return compareTo(cb) == 0;<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            } else {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>              return false;<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>            }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        };<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>      }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      @Override<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>      public void remove() {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>        throw new UnsupportedOperationException();<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>      }<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>    };<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  }<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  @Override<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  public BlockCache[] getBlockCaches() {<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    return null;<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span><a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  @Override<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    if (block.getMemoryType() == MemoryType.SHARED) {<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>      BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      if (bucketEntry != null) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>        int refCount = bucketEntry.decrementRefCountAndGet();<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        if (refCount == 0 &amp;&amp; bucketEntry.isMarkedForEvict()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          forceEvict(cacheKey);<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      }<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>  @VisibleForTesting<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>    if (bucketEntry != null) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      return bucketEntry.getRefCount();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    }<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    return 0;<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span><a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>  float getAcceptableFactor() {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    return acceptableFactor;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span><a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>  float getMinFactor() {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    return minFactor;<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>  float getExtraFreeFactor() {<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    return extraFreeFactor;<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>  }<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span><a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>  float getSingleFactor() {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    return singleFactor;<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  float getMultiFactor() {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    return multiFactor;<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>  }<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  float getMemoryFactor() {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    return memoryFactor;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>}<a name="line.1717"></a>
+<span class="sourceLineNo">1084</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  private void persistToFile() throws IOException {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    assert !cacheEnabled;<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>    if (!ioEngine.isPersistent()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<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>   * @see #persistToFile()<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   */<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    File persistenceFile = new File(persistencePath);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    if (!persistenceFile.exists()) {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    assert !cacheEnabled;<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      byte[] pbuf = new byte[pblen];<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      int read = in.read(pbuf);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      if (read != pblen) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            persistencePath);<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  /**<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>   * &lt;pre&gt;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>   *   File f = ...<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   *     // use the input stream<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   *   } finally {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>   *   }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   * &lt;/pre&gt;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @param file the file to read and delete<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>   * @return a FileInputStream for the given file<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>   * @throws IOException if there is a problem creating the stream<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>   */<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    return new FileInputStream(file) {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      public void close() throws IOException {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>        super.close();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>        if (!file.delete()) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>        }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    };<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>      throws IOException {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    if (capacitySize != cacheCapacity) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>          + ", expected:" + backingMap.getClass().getName());<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>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  /**<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * cache<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private void checkIOErrorIsTolerated() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        disableCache();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    } else {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      this.ioErrorStartTime = now;<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>    }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>  }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  private void disableCache() {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!cacheEnabled) return;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    cacheEnabled = false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    ioEngine.shutdown();<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.scheduleThreadPool.shutdown();<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    this.ramCache.clear();<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      this.backingMap.clear();<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>  }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>  private void join() throws InterruptedException {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      writerThreads[i].join();<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  public void shutdown() {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    disableCache();<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        + "; path to write=" + persistencePath);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      try {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>        join();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>        persistToFile();<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      } catch (IOException ex) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      } catch (InterruptedException e) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public CacheStats getStats() {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return cacheStats;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  public BucketAllocator getAllocator() {<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    return this.bucketAllocator;<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>  @Override<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  public long heapSize() {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    return this.heapSize.sum();<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  @Override<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public long size() {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    return this.realCacheSize.sum();<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  @Override<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>  public long getCurrentDataSize() {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    return size();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>  }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  public long getFreeSize() {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    return this.bucketAllocator.getFreeSize();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span><a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  @Override<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  public long getBlockCount() {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    return this.blockNumber.sum();<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>  @Override<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  public long getDataBlockCount() {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    return getBlockCount();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  public long getCurrentSize() {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    return this.bucketAllocator.getUsedSize();<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>  }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span><a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>  /**<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * Evicts all blocks for a specific HFile.<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * &lt;p&gt;<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   *<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>   * @return the number of blocks evicted<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span><a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    int numEvicted = 0;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    for (BlockCacheKey key : keySet) {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (evictBlock(key)) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>          ++numEvicted;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span><a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    return numEvicted;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>  }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>  /**<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   */<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  static class BucketEntry implements Serializable {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    // access counter comparator, descending order<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span><a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private int offsetBase;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private int length;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private byte offset1;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span><a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    /**<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>     */<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    byte deserialiserIndex;<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    private volatile long accessCounter;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    private BlockPriority priority;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span><a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    /**<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>     */<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    private final long cachedTime = System.nanoTime();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      setOffset(offset);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.length = length;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      this.accessCounter = accessCounter;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      if (inMemory) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.MEMORY;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      } else {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        this.priority = BlockPriority.SINGLE;<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    long offset() { // Java has no unsigned numbers<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      return o &lt;&lt; 8;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    private void setOffset(long value) {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      assert (value &amp; 0xFF) == 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      value &gt;&gt;= 8;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      offsetBase = (int) value;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    public int getLength() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return length;<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>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span><a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    public long getAccessCounter() {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      return accessCounter;<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    }<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span><a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    /**<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>     * Block has been accessed. Update its local access counter.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     */<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    public void access(long accessCounter) {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      this.accessCounter = accessCounter;<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        this.priority = BlockPriority.MULTI;<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    public BlockPriority getPriority() {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      return this.priority;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    public long getCachedTime() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      return cachedTime;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    protected int getRefCount() {<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      return 0;<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    }<a name="

<TRUNCATED>

[28/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
index 794e33b..3ec9a39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
@@ -1089,640 +1089,642 @@
 <span class="sourceLineNo">1081</span>  /**<a name="line.1081"></a>
 <span class="sourceLineNo">1082</span>   * @see #retrieveFromFile(int[])<a name="line.1082"></a>
 <span class="sourceLineNo">1083</span>   */<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  private void persistToFile() throws IOException {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    assert !cacheEnabled;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    if (!ioEngine.isPersistent()) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>  }<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>   * @see #persistToFile()<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>   */<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    File persistenceFile = new File(persistencePath);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (!persistenceFile.exists()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      return;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    assert !cacheEnabled;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      byte[] pbuf = new byte[pblen];<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      int read = in.read(pbuf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      if (read != pblen) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            persistencePath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  /**<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>   * &lt;pre&gt;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   *   File f = ...<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   *     // use the input stream<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   *   } finally {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   *   }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * &lt;/pre&gt;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * @param file the file to read and delete<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @return a FileInputStream for the given file<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @throws IOException if there is a problem creating the stream<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return new FileInputStream(file) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      public void close() throws IOException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        super.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (!file.delete()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    };<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      throws IOException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (capacitySize != cacheCapacity) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>  }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span><a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>  /**<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>   * cache<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   */<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>  private void checkIOErrorIsTolerated() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        disableCache();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    } else {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      this.ioErrorStartTime = now;<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>  /**<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   */<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>  private void disableCache() {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    if (!cacheEnabled) return;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    cacheEnabled = false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    ioEngine.shutdown();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    this.scheduleThreadPool.shutdown();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    this.ramCache.clear();<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.backingMap.clear();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  private void join() throws InterruptedException {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      writerThreads[i].join();<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  @Override<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  public void shutdown() {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    disableCache();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        + "; path to write=" + persistencePath);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        join();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>        persistToFile();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      } catch (IOException ex) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      } catch (InterruptedException e) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      }<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span><a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  public CacheStats getStats() {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    return cacheStats;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>  public BucketAllocator getAllocator() {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    return this.bucketAllocator;<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>  @Override<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public long heapSize() {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    return this.heapSize.sum();<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public long size() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return this.realCacheSize.sum();<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  @Override<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  public long getCurrentDataSize() {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    return size();<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  }<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>  @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>  public long getFreeSize() {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return this.bucketAllocator.getFreeSize();<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  public long getBlockCount() {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    return this.blockNumber.sum();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>  @Override<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  public long getDataBlockCount() {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    return getBlockCount();<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>  }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  @Override<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  public long getCurrentSize() {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    return this.bucketAllocator.getUsedSize();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  }<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>   * Evicts all blocks for a specific HFile.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * &lt;p&gt;<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   *<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * @return the number of blocks evicted<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    int numEvicted = 0;<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    for (BlockCacheKey key : keySet) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      if (evictBlock(key)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          ++numEvicted;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    return numEvicted;<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>  /**<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>   */<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  static class BucketEntry implements Serializable {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // access counter comparator, descending order<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    private int offsetBase;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    private int length;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private byte offset1;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    /**<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>     */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    byte deserialiserIndex;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    private volatile long accessCounter;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    private BlockPriority priority;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>     */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    private final long cachedTime = System.nanoTime();<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      setOffset(offset);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      this.length = length;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      this.accessCounter = accessCounter;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      if (inMemory) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        this.priority = BlockPriority.MEMORY;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.SINGLE;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    long offset() { // Java has no unsigned numbers<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return o &lt;&lt; 8;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private void setOffset(long value) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      assert (value &amp; 0xFF) == 0;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      value &gt;&gt;= 8;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      offsetBase = (int) value;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    public int getLength() {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return length;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span><a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<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>    public long getAccessCounter() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      return accessCounter;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span><a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    /**<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>     * Block has been accessed. Update its local access counter.<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>     */<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    public void access(long accessCounter) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      this.accessCounter = accessCounter;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        this.priority = BlockPriority.MULTI;<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><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    public BlockPriority getPriority() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return this.priority;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    public long getCachedTime() {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      return cachedTime;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    protected int getRefCount() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return 0;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    protected int incrementRefCountAndGet() {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      return 0;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span><a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    protected int decrementRefCountAndGet() {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    protected boolean isMarkedForEvict() {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      return false;<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    protected void markForEvict() {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      // noop;<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  static class SharedMemoryBucketEntry extends BucketEntry {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    private static final long serialVersionUID = -2187147283772338481L;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Set this when we were not able to forcefully evict the block<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    private volatile boolean markedForEvict;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    private AtomicInteger refCount = new AtomicInteger(0);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    SharedMemoryBucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      super(offset, length, accessCounter, inMemory);<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    @Override<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    protected int getRefCount() {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      return this.refCount.get();<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    @Override<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    protected int incrementRefCountAndGet() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      return this.refCount.incrementAndGet();<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>    @Override<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    protected int decrementRefCountAndGet() {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      return this.refCount.decrementAndGet();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    @Override<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    protected boolean isMarkedForEvict() {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      return this.markedForEvict;<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    @Override<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    protected void markForEvict() {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      this.markedForEvict = true;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  /**<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   * according to configuration parameters and their relative sizes.<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   */<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  private class BucketEntryGroup {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    private CachedEntryQueue queue;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    private long totalSize = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    private long bucketSize;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      this.bucketSize = bucketSize;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      totalSize = 0;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span><a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      totalSize += block.getValue().getLength();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      queue.add(block);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    public long free(long toFree) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>      long freedBytes = 0;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        if (evictBlock(entry.getKey(), false)) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          freedBytes += entry.getValue().getLength();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        }<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (freedBytes &gt;= toFree) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          return freedBytes;<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      }<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      return freedBytes;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    public long overflow() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      return totalSize - bucketSize;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span><a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    public long totalSize() {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      return totalSize;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span><a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  /**<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>   */<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  @VisibleForTesting<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>  static class RAMQueueEntry {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private BlockCacheKey key;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    private Cacheable data;<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    private long accessCounter;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    private boolean inMemory;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    public RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        boolean inMemory) {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>      this.key = bck;<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      this.data = data;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      this.accessCounter = accessCounter;<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>      this.inMemory = inMemory;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    public Cacheable getData() {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      return data;<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span><a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    public BlockCacheKey getKey() {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return key;<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    public void access(long accessCounter) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      this.accessCounter = accessCounter;<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    public BucketEntry writeToCache(final IOEngine ioEngine,<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        final BucketAllocator bucketAllocator,<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>        final LongAdder realCacheSize) throws CacheFullException, IOException,<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        BucketAllocatorException {<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      int len = data.getSerializedLength();<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      // This cacheable thing can't be serialized<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      if (len == 0) return null;<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      long offset = bucketAllocator.allocateBlock(len);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      BucketEntry bucketEntry = ioEngine.usesSharedMemory()<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>          ? UnsafeAvailChecker.isAvailable()<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>              ? new UnsafeSharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>              : new SharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          : new BucketEntry(offset, len, accessCounter, inMemory);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      bucketEntry.setDeserialiserReference(data.getDeserializer());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      try {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>        if (data instanceof HFileBlock) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>          HFileBlock block = (HFileBlock)data;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          if (LOG.isTraceEnabled()) {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>            LOG.trace("Write offset=" + offset + ", len=" + len);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>          }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>          ioEngine.write(sliceBuf, offset);<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>        } else {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>          data.serialize(bb, true);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>          ioEngine.write(bb, offset);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      } catch (IOException ioe) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        // free it in bucket allocator<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>        bucketAllocator.freeBlock(offset);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw ioe;<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      realCacheSize.add(len);<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      return bucketEntry;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    }<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  /**<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * Only used in test<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @throws InterruptedException<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   */<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      writerThread.disableWriter();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      writerThread.interrupt();<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      writerThread.join();<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>  }<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span><a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        this.backingMap.entrySet().iterator();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      private final long now = System.nanoTime();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      @Override<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      public boolean hasNext() {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>        return i.hasNext();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      @Override<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      public CachedBlock next() {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>        return new CachedBlock() {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>          @Override<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>          public String toString() {<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>            return BlockCacheUtil.toString(this, now);<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>          public BlockPriority getBlockPriority() {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            return e.getValue().getPriority();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>          }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          @Override<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>          public BlockType getBlockType() {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return null;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public long getOffset() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().getOffset();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public long getSize() {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            return e.getValue().getLength();<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          }<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>          @Override<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>          public long getCachedTime() {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            return e.getValue().getCachedTime();<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          public String getFilename() {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>            return e.getKey().getHfileName();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>          public int compareTo(CachedBlock other) {<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>            if (diff != 0) return diff;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span><a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            if (diff != 0) return diff;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>                other.getCachedTime());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>            }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span><a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          @Override<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>          public int hashCode() {<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            return e.getKey().hashCode();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          }<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>          @Override<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          public boolean equals(Object obj) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            if (obj instanceof CachedBlock) {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              return compareTo(cb) == 0;<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            } else {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>              return false;<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>            }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        };<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>      }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      @Override<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>      public void remove() {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>        throw new UnsupportedOperationException();<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>      }<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>    };<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  }<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  @Override<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  public BlockCache[] getBlockCaches() {<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    return null;<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span><a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  @Override<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    if (block.getMemoryType() == MemoryType.SHARED) {<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>      BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      if (bucketEntry != null) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>        int refCount = bucketEntry.decrementRefCountAndGet();<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        if (refCount == 0 &amp;&amp; bucketEntry.isMarkedForEvict()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          forceEvict(cacheKey);<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      }<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>  @VisibleForTesting<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>    if (bucketEntry != null) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      return bucketEntry.getRefCount();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    }<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    return 0;<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span><a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>  float getAcceptableFactor() {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    return acceptableFactor;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span><a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>  float getMinFactor() {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    return minFactor;<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>  float getExtraFreeFactor() {<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    return extraFreeFactor;<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>  }<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span><a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>  float getSingleFactor() {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    return singleFactor;<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  float getMultiFactor() {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    return multiFactor;<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>  }<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  float getMemoryFactor() {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    return memoryFactor;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>}<a name="line.1717"></a>
+<span class="sourceLineNo">1084</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  private void persistToFile() throws IOException {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    assert !cacheEnabled;<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>    if (!ioEngine.isPersistent()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<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>   * @see #persistToFile()<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   */<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    File persistenceFile = new File(persistencePath);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    if (!persistenceFile.exists()) {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    assert !cacheEnabled;<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      byte[] pbuf = new byte[pblen];<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      int read = in.read(pbuf);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      if (read != pblen) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            persistencePath);<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  /**<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>   * &lt;pre&gt;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>   *   File f = ...<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   *     // use the input stream<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   *   } finally {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>   *   }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   * &lt;/pre&gt;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @param file the file to read and delete<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>   * @return a FileInputStream for the given file<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>   * @throws IOException if there is a problem creating the stream<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>   */<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    return new FileInputStream(file) {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      public void close() throws IOException {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>        super.close();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>        if (!file.delete()) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>        }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    };<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>      throws IOException {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    if (capacitySize != cacheCapacity) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>          + ", expected:" + backingMap.getClass().getName());<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>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  /**<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * cache<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private void checkIOErrorIsTolerated() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        disableCache();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    } else {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      this.ioErrorStartTime = now;<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>    }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>  }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  private void disableCache() {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!cacheEnabled) return;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    cacheEnabled = false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    ioEngine.shutdown();<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.scheduleThreadPool.shutdown();<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    this.ramCache.clear();<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      this.backingMap.clear();<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>  }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>  private void join() throws InterruptedException {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      writerThreads[i].join();<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  public void shutdown() {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    disableCache();<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        + "; path to write=" + persistencePath);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      try {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>        join();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>        persistToFile();<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      } catch (IOException ex) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      } catch (InterruptedException e) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public CacheStats getStats() {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return cacheStats;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  public BucketAllocator getAllocator() {<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    return this.bucketAllocator;<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>  @Override<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  public long heapSize() {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    return this.heapSize.sum();<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  @Override<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public long size() {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    return this.realCacheSize.sum();<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  @Override<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>  public long getCurrentDataSize() {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    return size();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>  }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  public long getFreeSize() {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    return this.bucketAllocator.getFreeSize();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span><a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  @Override<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  public long getBlockCount() {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    return this.blockNumber.sum();<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>  @Override<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  public long getDataBlockCount() {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    return getBlockCount();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  public long getCurrentSize() {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    return this.bucketAllocator.getUsedSize();<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>  }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span><a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>  /**<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * Evicts all blocks for a specific HFile.<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * &lt;p&gt;<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   *<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>   * @return the number of blocks evicted<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span><a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    int numEvicted = 0;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    for (BlockCacheKey key : keySet) {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (evictBlock(key)) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>          ++numEvicted;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span><a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    return numEvicted;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>  }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>  /**<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   */<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  static class BucketEntry implements Serializable {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    // access counter comparator, descending order<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span><a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private int offsetBase;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private int length;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private byte offset1;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span><a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    /**<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>     */<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    byte deserialiserIndex;<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    private volatile long accessCounter;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    private BlockPriority priority;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span><a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    /**<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>     */<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    private final long cachedTime = System.nanoTime();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      setOffset(offset);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.length = length;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      this.accessCounter = accessCounter;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      if (inMemory) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.MEMORY;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      } else {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        this.priority = BlockPriority.SINGLE;<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    long offset() { // Java has no unsigned numbers<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      return o &lt;&lt; 8;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    private void setOffset(long value) {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      assert (value &amp; 0xFF) == 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      value &gt;&gt;= 8;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      offsetBase = (int) value;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    public int getLength() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return length;<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>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span><a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    public long getAccessCounter() {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      return accessCounter;<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    }<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span><a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    /**<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>     * Block has been accessed. Update its local access counter.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     */<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    public void access(long accessCounter) {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      this.accessCounter = accessCounter;<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        this.priority = BlockPriority.MULTI;<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    public BlockPriority getPriority() {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      return this.priority;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    public long getCachedTime() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      return cachedTime;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    protected int getRefCount() {<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      return 0;<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    }<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span><a na

<TRUNCATED>

[30/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.StatisticsThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.StatisticsThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.StatisticsThread.html
index 794e33b..3ec9a39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.StatisticsThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.StatisticsThread.html
@@ -1089,640 +1089,642 @@
 <span class="sourceLineNo">1081</span>  /**<a name="line.1081"></a>
 <span class="sourceLineNo">1082</span>   * @see #retrieveFromFile(int[])<a name="line.1082"></a>
 <span class="sourceLineNo">1083</span>   */<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  private void persistToFile() throws IOException {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    assert !cacheEnabled;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    if (!ioEngine.isPersistent()) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>  }<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>   * @see #persistToFile()<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>   */<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    File persistenceFile = new File(persistencePath);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (!persistenceFile.exists()) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      return;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    assert !cacheEnabled;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span><a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      byte[] pbuf = new byte[pblen];<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      int read = in.read(pbuf);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      if (read != pblen) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            persistencePath);<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  /**<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>   * &lt;pre&gt;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   *   File f = ...<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   *     // use the input stream<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   *   } finally {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>   *   }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>   * &lt;/pre&gt;<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>   * @param file the file to read and delete<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @return a FileInputStream for the given file<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   * @throws IOException if there is a problem creating the stream<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return new FileInputStream(file) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      @Override<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      public void close() throws IOException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        super.close();<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (!file.delete()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    };<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  }<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      throws IOException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    if (capacitySize != cacheCapacity) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>  }<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span><a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>  /**<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>   * cache<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>   */<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>  private void checkIOErrorIsTolerated() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        disableCache();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    } else {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      this.ioErrorStartTime = now;<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>  }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>  /**<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>   */<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>  private void disableCache() {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    if (!cacheEnabled) return;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    cacheEnabled = false;<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    ioEngine.shutdown();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    this.scheduleThreadPool.shutdown();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    this.ramCache.clear();<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      this.backingMap.clear();<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  private void join() throws InterruptedException {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      writerThreads[i].join();<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  @Override<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  public void shutdown() {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    disableCache();<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>        + "; path to write=" + persistencePath);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        join();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>        persistToFile();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      } catch (IOException ex) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      } catch (InterruptedException e) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      }<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>  }<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span><a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>  @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  public CacheStats getStats() {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    return cacheStats;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>  public BucketAllocator getAllocator() {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    return this.bucketAllocator;<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>  @Override<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public long heapSize() {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    return this.heapSize.sum();<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span><a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public long size() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return this.realCacheSize.sum();<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  @Override<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>  public long getCurrentDataSize() {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    return size();<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>  }<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>  @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>  public long getFreeSize() {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    return this.bucketAllocator.getFreeSize();<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  public long getBlockCount() {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    return this.blockNumber.sum();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>  @Override<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  public long getDataBlockCount() {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    return getBlockCount();<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>  }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>  @Override<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  public long getCurrentSize() {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    return this.bucketAllocator.getUsedSize();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>  }<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>   * Evicts all blocks for a specific HFile.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>   * &lt;p&gt;<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>   *<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * @return the number of blocks evicted<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   */<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>  @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    int numEvicted = 0;<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    for (BlockCacheKey key : keySet) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      if (evictBlock(key)) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          ++numEvicted;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    return numEvicted;<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>  /**<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>   */<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  static class BucketEntry implements Serializable {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    // access counter comparator, descending order<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span><a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    private int offsetBase;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>    private int length;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private byte offset1;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span><a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    /**<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>     */<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    byte deserialiserIndex;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    private volatile long accessCounter;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    private BlockPriority priority;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span><a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    /**<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>     */<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    private final long cachedTime = System.nanoTime();<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      setOffset(offset);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      this.length = length;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      this.accessCounter = accessCounter;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      if (inMemory) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        this.priority = BlockPriority.MEMORY;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.SINGLE;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    long offset() { // Java has no unsigned numbers<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return o &lt;&lt; 8;<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private void setOffset(long value) {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      assert (value &amp; 0xFF) == 0;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      value &gt;&gt;= 8;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      offsetBase = (int) value;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    public int getLength() {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return length;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span><a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<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>    public long getAccessCounter() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      return accessCounter;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span><a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    /**<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>     * Block has been accessed. Update its local access counter.<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>     */<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    public void access(long accessCounter) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      this.accessCounter = accessCounter;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        this.priority = BlockPriority.MULTI;<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><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    public BlockPriority getPriority() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return this.priority;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    public long getCachedTime() {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      return cachedTime;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span><a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    protected int getRefCount() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return 0;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    protected int incrementRefCountAndGet() {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      return 0;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span><a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    protected int decrementRefCountAndGet() {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      return 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span><a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    protected boolean isMarkedForEvict() {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      return false;<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    protected void markForEvict() {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      // noop;<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  }<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  static class SharedMemoryBucketEntry extends BucketEntry {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    private static final long serialVersionUID = -2187147283772338481L;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    // Set this when we were not able to forcefully evict the block<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    private volatile boolean markedForEvict;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>    private AtomicInteger refCount = new AtomicInteger(0);<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    SharedMemoryBucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      super(offset, length, accessCounter, inMemory);<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    }<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span><a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    @Override<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    protected int getRefCount() {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      return this.refCount.get();<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    @Override<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    protected int incrementRefCountAndGet() {<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      return this.refCount.incrementAndGet();<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>    @Override<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    protected int decrementRefCountAndGet() {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      return this.refCount.decrementAndGet();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    @Override<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    protected boolean isMarkedForEvict() {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      return this.markedForEvict;<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span><a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    @Override<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    protected void markForEvict() {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      this.markedForEvict = true;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>  }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span><a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  /**<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   * according to configuration parameters and their relative sizes.<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   */<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>  private class BucketEntryGroup {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    private CachedEntryQueue queue;<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    private long totalSize = 0;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    private long bucketSize;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span><a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      this.bucketSize = bucketSize;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      totalSize = 0;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span><a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      totalSize += block.getValue().getLength();<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      queue.add(block);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    public long free(long toFree) {<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>      long freedBytes = 0;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>        if (evictBlock(entry.getKey(), false)) {<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>          freedBytes += entry.getValue().getLength();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        }<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>        if (freedBytes &gt;= toFree) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>          return freedBytes;<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      }<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      return freedBytes;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    public long overflow() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      return totalSize - bucketSize;<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    }<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span><a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>    public long totalSize() {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      return totalSize;<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>  }<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span><a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  /**<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>   */<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  @VisibleForTesting<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>  static class RAMQueueEntry {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private BlockCacheKey key;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    private Cacheable data;<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    private long accessCounter;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    private boolean inMemory;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    public RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>        boolean inMemory) {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>      this.key = bck;<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      this.data = data;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      this.accessCounter = accessCounter;<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>      this.inMemory = inMemory;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    public Cacheable getData() {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      return data;<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span><a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    public BlockCacheKey getKey() {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return key;<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    public void access(long accessCounter) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      this.accessCounter = accessCounter;<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    }<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span><a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    public BucketEntry writeToCache(final IOEngine ioEngine,<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>        final BucketAllocator bucketAllocator,<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>        final LongAdder realCacheSize) throws CacheFullException, IOException,<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        BucketAllocatorException {<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>      int len = data.getSerializedLength();<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      // This cacheable thing can't be serialized<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      if (len == 0) return null;<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      long offset = bucketAllocator.allocateBlock(len);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      BucketEntry bucketEntry = ioEngine.usesSharedMemory()<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>          ? UnsafeAvailChecker.isAvailable()<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>              ? new UnsafeSharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>              : new SharedMemoryBucketEntry(offset, len, accessCounter, inMemory)<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>          : new BucketEntry(offset, len, accessCounter, inMemory);<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      bucketEntry.setDeserialiserReference(data.getDeserializer());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      try {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>        if (data instanceof HFileBlock) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>          HFileBlock block = (HFileBlock)data;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          if (LOG.isTraceEnabled()) {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>            LOG.trace("Write offset=" + offset + ", len=" + len);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>          }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>          ioEngine.write(sliceBuf, offset);<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>        } else {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>          data.serialize(bb, true);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>          ioEngine.write(bb, offset);<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        }<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      } catch (IOException ioe) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        // free it in bucket allocator<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>        bucketAllocator.freeBlock(offset);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        throw ioe;<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>      }<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span><a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>      realCacheSize.add(len);<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>      return bucketEntry;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    }<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>  }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>  /**<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * Only used in test<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @throws InterruptedException<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   */<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      writerThread.disableWriter();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>      writerThread.interrupt();<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      writerThread.join();<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>  }<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span><a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>  @Override<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        this.backingMap.entrySet().iterator();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      private final long now = System.nanoTime();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>      @Override<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>      public boolean hasNext() {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>        return i.hasNext();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span><a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>      @Override<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      public CachedBlock next() {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>        return new CachedBlock() {<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>          @Override<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>          public String toString() {<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>            return BlockCacheUtil.toString(this, now);<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          }<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span><a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          @Override<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>          public BlockPriority getBlockPriority() {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            return e.getValue().getPriority();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>          }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          @Override<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>          public BlockType getBlockType() {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return null;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public long getOffset() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().getOffset();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public long getSize() {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            return e.getValue().getLength();<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          }<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span><a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>          @Override<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>          public long getCachedTime() {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            return e.getValue().getCachedTime();<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>          public String getFilename() {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>            return e.getKey().getHfileName();<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span><a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>          public int compareTo(CachedBlock other) {<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>            if (diff != 0) return diff;<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span><a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            if (diff != 0) return diff;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>                other.getCachedTime());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>            }<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span><a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          @Override<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>          public int hashCode() {<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            return e.getKey().hashCode();<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          }<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>          @Override<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          public boolean equals(Object obj) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            if (obj instanceof CachedBlock) {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              return compareTo(cb) == 0;<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            } else {<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>              return false;<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>            }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        };<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>      }<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span><a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      @Override<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>      public void remove() {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>        throw new UnsupportedOperationException();<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>      }<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>    };<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>  }<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span><a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>  @Override<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  public BlockCache[] getBlockCaches() {<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    return null;<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  }<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span><a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>  @Override<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    if (block.getMemoryType() == MemoryType.SHARED) {<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>      BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>      if (bucketEntry != null) {<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>        int refCount = bucketEntry.decrementRefCountAndGet();<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>        if (refCount == 0 &amp;&amp; bucketEntry.isMarkedForEvict()) {<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>          forceEvict(cacheKey);<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>        }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>      }<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    }<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>  @VisibleForTesting<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>    if (bucketEntry != null) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      return bucketEntry.getRefCount();<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    }<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    return 0;<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>  }<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span><a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>  float getAcceptableFactor() {<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    return acceptableFactor;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span><a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>  float getMinFactor() {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    return minFactor;<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>  float getExtraFreeFactor() {<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    return extraFreeFactor;<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>  }<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span><a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>  float getSingleFactor() {<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    return singleFactor;<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>  }<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span><a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>  float getMultiFactor() {<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    return multiFactor;<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>  }<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  float getMemoryFactor() {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>    return memoryFactor;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>}<a name="line.1717"></a>
+<span class="sourceLineNo">1084</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  private void persistToFile() throws IOException {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    assert !cacheEnabled;<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>    if (!ioEngine.isPersistent()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<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>   * @see #persistToFile()<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>   */<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    File persistenceFile = new File(persistencePath);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    if (!persistenceFile.exists()) {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    assert !cacheEnabled;<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      byte[] pbuf = new byte[pblen];<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      int read = in.read(pbuf);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      if (read != pblen) {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            persistencePath);<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>  }<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  /**<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>   * &lt;pre&gt;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>   *   File f = ...<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   *     // use the input stream<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   *   } finally {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>   *   }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   * &lt;/pre&gt;<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @param file the file to read and delete<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>   * @return a FileInputStream for the given file<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>   * @throws IOException if there is a problem creating the stream<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>   */<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    return new FileInputStream(file) {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      @Override<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      public void close() throws IOException {<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>        super.close();<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>        if (!file.delete()) {<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>          throw new IOException("Failed deleting persistence file " + file.getAbsolutePath());<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>        }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    };<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>      throws IOException {<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    if (capacitySize != cacheCapacity) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>          + ", expected:" + backingMap.getClass().getName());<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>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap());<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  /**<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * cache<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  private void checkIOErrorIsTolerated() {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    if (this.ioErrorStartTime &gt; 0) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTime) &gt; this.ioErrorsTolerationDuration) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        disableCache();<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    } else {<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      this.ioErrorStartTime = now;<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>    }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>  }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  private void disableCache() {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!cacheEnabled) return;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    cacheEnabled = false;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    ioEngine.shutdown();<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    this.scheduleThreadPool.shutdown();<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    this.ramCache.clear();<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      this.backingMap.clear();<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>  }<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span><a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>  private void join() throws InterruptedException {<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>      writerThreads[i].join();<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span><a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  @Override<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  public void shutdown() {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    disableCache();<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        + "; path to write=" + persistencePath);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      try {<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>        join();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>        persistToFile();<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      } catch (IOException ex) {<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      } catch (InterruptedException e) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>      }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    }<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public CacheStats getStats() {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return cacheStats;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  public BucketAllocator getAllocator() {<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    return this.bucketAllocator;<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>  @Override<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>  public long heapSize() {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    return this.heapSize.sum();<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>  @Override<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>  public long size() {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    return this.realCacheSize.sum();<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>  }<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>  @Override<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>  public long getCurrentDataSize() {<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>    return size();<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>  }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>  @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  public long getFreeSize() {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    return this.bucketAllocator.getFreeSize();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span><a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  @Override<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  public long getBlockCount() {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    return this.blockNumber.sum();<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>  @Override<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  public long getDataBlockCount() {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    return getBlockCount();<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span><a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  public long getCurrentSize() {<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    return this.bucketAllocator.getUsedSize();<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>  }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span><a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>  /**<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   * Evicts all blocks for a specific HFile.<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>   * &lt;p&gt;<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>   *<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>   * @return the number of blocks evicted<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>  @Override<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span><a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    int numEvicted = 0;<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    for (BlockCacheKey key : keySet) {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (evictBlock(key)) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>          ++numEvicted;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span><a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    return numEvicted;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>  }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>  /**<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>   * Item in cache. We expect this to be where most memory goes. Java uses 8<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>   * bytes just for object headers; after this, we want to use as little as<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>   * possible - so we only use 8 bytes, but in order to do so we end up messing<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>   * around with all this Java casting stuff. Offset stored as 5 bytes that make<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>   * up the long. Doubt we'll see devices this big for ages. Offsets are divided<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>   * by 256. So 5 bytes gives us 256TB or so.<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   */<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  static class BucketEntry implements Serializable {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    private static final long serialVersionUID = -6741504807982257534L;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    // access counter comparator, descending order<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>    static final Comparator&lt;BucketEntry&gt; COMPARATOR = Comparator<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>        .comparingLong(BucketEntry::getAccessCounter).reversed();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span><a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private int offsetBase;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private int length;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private byte offset1;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span><a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    /**<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>     * The index of the deserializer that can deserialize this BucketEntry content.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>     * See {@link CacheableDeserializerIdManager} for hosting of index to serializers.<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>     */<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    byte deserialiserIndex;<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    private volatile long accessCounter;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    private BlockPriority priority;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span><a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    /**<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>     * Time this block was cached.  Presumes we are created just before we are added to the cache.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>     */<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    private final long cachedTime = System.nanoTime();<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    BucketEntry(long offset, int length, long accessCounter, boolean inMemory) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      setOffset(offset);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.length = length;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      this.accessCounter = accessCounter;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      if (inMemory) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        this.priority = BlockPriority.MEMORY;<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      } else {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        this.priority = BlockPriority.SINGLE;<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    long offset() { // Java has no unsigned numbers<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      long o = ((long) offsetBase) &amp; 0xFFFFFFFFL; //This needs the L cast otherwise it will be sign extended as a negative number.<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      o += (((long) (offset1)) &amp; 0xFF) &lt;&lt; 32; //The 0xFF here does not need the L cast because it is treated as a positive int.<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      return o &lt;&lt; 8;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    private void setOffset(long value) {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      assert (value &amp; 0xFF) == 0;<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      value &gt;&gt;= 8;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      offsetBase = (int) value;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      offset1 = (byte) (value &gt;&gt; 32);<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    public int getLength() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return length;<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>    protected CacheableDeserializer&lt;Cacheable&gt; deserializerReference() {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      return CacheableDeserializerIdManager.getDeserializer(deserialiserIndex);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span><a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    protected void setDeserialiserReference(CacheableDeserializer&lt;Cacheable&gt; deserializer) {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.deserialiserIndex = (byte) deserializer.getDeserialiserIdentifier();<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    public long getAccessCounter() {<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      return accessCounter;<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    }<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span><a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    /**<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>     * Block has been accessed. Update its local access counter.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     */<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    public void access(long accessCounter) {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      this.accessCounter = accessCounter;<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      if (this.priority == BlockPriority.SINGLE) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        this.priority = BlockPriority.MULTI;<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    }<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    public BlockPriority getPriority() {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      return this.priority;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    public long getCachedTime() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      return cachedTime;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    protected int getRefCount() {<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      return 0;<a name="line.1390"></a>
+<span class="sourceLineNo">

<TRUNCATED>

[19/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
index 4bb2842..7a690c4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
@@ -137,7 +137,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.999">TestSplitTransactionOnCluster.CustomSplitPolicy</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.1016">TestSplitTransactionOnCluster.CustomSplitPolicy</a>
 extends org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</pre>
 </li>
 </ul>
@@ -260,7 +260,7 @@ extends org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPo
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CustomSplitPolicy</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html#line.999">CustomSplitPolicy</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html#line.1016">CustomSplitPolicy</a>()</pre>
 </li>
 </ul>
 </li>
@@ -277,7 +277,7 @@ extends org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPo
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldSplit</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html#line.1002">shouldSplit</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html#line.1019">shouldSplit</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code>shouldSplit</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</code></dd>
@@ -290,7 +290,7 @@ extends org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPo
 <ul class="blockListLast">
 <li class="blockList">
 <h4>skipStoreFileRangeCheck</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html#line.1007">skipStoreFileRangeCheck</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;familyName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html#line.1024">skipStoreFileRangeCheck</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;familyName)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code>skipStoreFileRangeCheck</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.regionserver.RegionSplitPolicy</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
index c3fd31b..faf8c6e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.273">TestSplitTransactionOnCluster.FailingSplitMasterObserver</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.275">TestSplitTransactionOnCluster.FailingSplitMasterObserver</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 org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.hadoop.hbase.coprocessor.MasterObserver</pre>
 </li>
@@ -252,7 +252,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>latch</h4>
-<pre>volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.274">latch</a></pre>
+<pre>volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.276">latch</a></pre>
 </li>
 </ul>
 </li>
@@ -269,7 +269,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FailingSplitMasterObserver</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.273">FailingSplitMasterObserver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.275">FailingSplitMasterObserver</a>()</pre>
 </li>
 </ul>
 </li>
@@ -286,7 +286,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.277">start</a>(org.apache.hadoop.hbase.CoprocessorEnvironment&nbsp;e)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.279">start</a>(org.apache.hadoop.hbase.CoprocessorEnvironment&nbsp;e)
            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>
@@ -302,7 +302,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterObserver</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.MasterObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.282">getMasterObserver</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.MasterObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.284">getMasterObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getMasterObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.MasterCoprocessor</code></dd>
@@ -315,7 +315,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>preSplitRegionBeforeMETAAction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.287">preSplitRegionBeforeMETAAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.FailingSplitMasterObserver.html#line.289">preSplitRegionBeforeMETAAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
                                            byte[]&nbsp;splitKey,
                                            <a href="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.client.Mutation&gt;&nbsp;metaEntries)
                                     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/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
index a127e10..89aebcb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.958">TestSplitTransactionOnCluster.MyMaster</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.975">TestSplitTransactionOnCluster.MyMaster</a>
 extends org.apache.hadoop.hbase.master.HMaster</pre>
 </li>
 </ul>
@@ -301,7 +301,7 @@ extends org.apache.hadoop.hbase.master.HMaster</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MyMaster</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html#line.959">MyMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html#line.976">MyMaster</a>(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>,
                 org.apache.zookeeper.KeeperException,
                 <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>
@@ -327,7 +327,7 @@ extends org.apache.hadoop.hbase.master.HMaster</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createRpcServices</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.RSRpcServices&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html#line.964">createRpcServices</a>()
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.RSRpcServices&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html#line.981">createRpcServices</a>()
                                                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
index c0c5f65..9fac223 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.969">TestSplitTransactionOnCluster.MyMasterRpcServices</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.986">TestSplitTransactionOnCluster.MyMasterRpcServices</a>
 extends org.apache.hadoop.hbase.master.MasterRpcServices</pre>
 </li>
 </ul>
@@ -256,7 +256,7 @@ extends org.apache.hadoop.hbase.master.MasterRpcServices</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>enabled</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.970">enabled</a></pre>
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.987">enabled</a></pre>
 </li>
 </ul>
 <a name="myMaster">
@@ -265,7 +265,7 @@ extends org.apache.hadoop.hbase.master.MasterRpcServices</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>myMaster</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.master.HMaster <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.972">myMaster</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.master.HMaster <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.989">myMaster</a></pre>
 </li>
 </ul>
 </li>
@@ -282,7 +282,7 @@ extends org.apache.hadoop.hbase.master.MasterRpcServices</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MyMasterRpcServices</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.973">MyMasterRpcServices</a>(org.apache.hadoop.hbase.master.HMaster&nbsp;master)
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.990">MyMasterRpcServices</a>(org.apache.hadoop.hbase.master.HMaster&nbsp;master)
                     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>
@@ -304,7 +304,7 @@ extends org.apache.hadoop.hbase.master.MasterRpcServices</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>reportRegionStateTransition</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.979">reportRegionStateTransition</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html#line.996">reportRegionStateTransition</a>(org.apache.hbase.thirdparty.com.google.protobuf.RpcController&nbsp;c,
                                                                                                                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest&nbsp;req)
                                                                                                                                            throws org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
index 4234a7b..8a1738c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.117">TestSplitTransactionOnCluster</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.119">TestSplitTransactionOnCluster</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">The below tests are testing split region against a running cluster</div>
 </li>
@@ -381,7 +381,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.120">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.122">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -390,7 +390,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.123">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.125">LOG</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -399,7 +399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>admin</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.124">admin</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.126">admin</a></pre>
 </li>
 </ul>
 <a name="cluster">
@@ -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>cluster</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.125">cluster</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.127">cluster</a></pre>
 </li>
 </ul>
 <a name="NB_SERVERS">
@@ -417,7 +417,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>NB_SERVERS</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.126">NB_SERVERS</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.128">NB_SERVERS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestSplitTransactionOnCluster.NB_SERVERS">Constant Field Values</a></dd>
@@ -430,7 +430,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TESTING_UTIL</h4>
-<pre>static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.128">TESTING_UTIL</a></pre>
+<pre>static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.130">TESTING_UTIL</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -439,7 +439,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.132">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.134">name</a></pre>
 </li>
 </ul>
 </li>
@@ -456,7 +456,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestSplitTransactionOnCluster</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.117">TestSplitTransactionOnCluster</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.119">TestSplitTransactionOnCluster</a>()</pre>
 </li>
 </ul>
 </li>
@@ -473,7 +473,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>before</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.134">before</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.136">before</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -487,7 +487,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>after</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.139">after</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.141">after</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -501,7 +501,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.143">setup</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.145">setup</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -515,7 +515,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.150">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.152">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -529,7 +529,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAndCheckSingleTableRegion</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.RegionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.158">getAndCheckSingleTableRegion</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.regionserver.HRegion&gt;&nbsp;regions)
+<pre>private&nbsp;org.apache.hadoop.hbase.client.RegionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.160">getAndCheckSingleTableRegion</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.regionserver.HRegion&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>,
                                                                                <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>
 <dl>
@@ -545,7 +545,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>requestSplitRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.170">requestSplitRegion</a>(org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;rsServer,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.172">requestSplitRegion</a>(org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;rsServer,
                                 org.apache.hadoop.hbase.regionserver.Region&nbsp;region,
                                 byte[]&nbsp;midKey)
                          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>
@@ -561,7 +561,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRITStateForRollback</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.181">testRITStateForRollback</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.183">testRITStateForRollback</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -575,7 +575,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSplitFailedCompactionAndSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.230">testSplitFailedCompactionAndSplit</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.232">testSplitFailedCompactionAndSplit</a>()
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -589,7 +589,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSplitRollbackOnRegionClosing</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.297">testSplitRollbackOnRegionClosing</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.299">testSplitRollbackOnRegionClosing</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>,
                                              <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>
 <dl>
@@ -605,7 +605,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testShutdownFixupWhenDaughterHasSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.357">testShutdownFixupWhenDaughterHasSplit</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.359">testShutdownFixupWhenDaughterHasSplit</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>,
                                                   <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">Test that if daughter split on us, we won't do the shutdown handler fixup
@@ -623,7 +623,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.438">testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.447">testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles</a>()
                                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -637,7 +637,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMasterRestartAtRegionSplitPendingCatalogJanitor</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.511">testMasterRestartAtRegionSplitPendingCatalogJanitor</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.520">testMasterRestartAtRegionSplitPendingCatalogJanitor</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>,
                                                                 <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>,
                                                                 org.apache.zookeeper.KeeperException.NodeExistsException,
@@ -661,7 +661,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSplitWithRegionReplicas</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.568">testSplitWithRegionReplicas</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.585">testSplitWithRegionReplicas</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -675,7 +675,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>insertData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.640">insertData</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.657">insertData</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                         org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                         org.apache.hadoop.hbase.client.Table&nbsp;t)
                  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>,
@@ -693,7 +693,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSplitRegionWithNoStoreFiles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.662">testSplitRegionWithNoStoreFiles</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.679">testSplitRegionWithNoStoreFiles</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>
 <div class="block">If a table has regions that have no store files in a region, they should split successfully
  into two regions with no store files.</div>
@@ -709,7 +709,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStoreFileReferenceCreationWhenSplitPolicySaysToSkipRangeCheck</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.748">testStoreFileReferenceCreationWhenSplitPolicySaysToSkipRangeCheck</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.765">testStoreFileReferenceCreationWhenSplitPolicySaysToSkipRangeCheck</a>()
                                                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -723,7 +723,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>findSplittableRegion</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.783">findSplittableRegion</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.regionserver.HRegion&gt;&nbsp;regions)
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.800">findSplittableRegion</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.regionserver.HRegion&gt;&nbsp;regions)
                                                                    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>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -737,7 +737,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndGetDaughters</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;org.apache.hadoop.hbase.regionserver.HRegion&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.795">checkAndGetDaughters</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
+<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;org.apache.hadoop.hbase.regionserver.HRegion&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.812">checkAndGetDaughters</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
                                                                          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>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -751,7 +751,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>abortAndWaitForMaster</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.master.HMaster&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.808">abortAndWaitForMaster</a>()
+<pre>private&nbsp;org.apache.hadoop.hbase.master.HMaster&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.825">abortAndWaitForMaster</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>,
                                                                      <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>
 <dl>
@@ -767,7 +767,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>split</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.817">split</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;hri,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.834">split</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;hri,
                    org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;server,
                    int&nbsp;regionCount)
             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>,
@@ -785,7 +785,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ensureTableRegionNotOnSameServerAsMeta</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.839">ensureTableRegionNotOnSameServerAsMeta</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.856">ensureTableRegionNotOnSameServerAsMeta</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                                                    org.apache.hadoop.hbase.client.RegionInfo&nbsp;hri)
                                             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>,
                                                    org.apache.hadoop.hbase.MasterNotRunningException,
@@ -814,7 +814,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getOtherRegionServer</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.895">getOtherRegionServer</a>(<a href="../../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;cluster,
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.912">getOtherRegionServer</a>(<a href="../../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;cluster,
                                                                                 org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;notThisOne)</pre>
 <div class="block">Find regionserver other than the one passed.
  Can't rely on indexes into list of regionservers since crashed servers
@@ -835,7 +835,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>printOutRegions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.906">printOutRegions</a>(org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;hrs,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.923">printOutRegions</a>(org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;hrs,
                              <a href="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;prefix)
                       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>
@@ -850,7 +850,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitUntilRegionServerDead</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.914">waitUntilRegionServerDead</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.931">waitUntilRegionServerDead</a>()
                                 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>,
                                        <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>
@@ -866,7 +866,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>awaitDaughters</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.927">awaitDaughters</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.944">awaitDaughters</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                             int&nbsp;numDaughters)
                      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>
 <dl>
@@ -881,7 +881,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>awaitTableRegions</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;org.apache.hadoop.hbase.regionserver.HRegion&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.938">awaitTableRegions</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
+<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;org.apache.hadoop.hbase.regionserver.HRegion&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.955">awaitTableRegions</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
                                                                       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>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -895,7 +895,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createTableAndWait</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.Table&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.948">createTableAndWait</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;org.apache.hadoop.hbase.client.Table&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#line.965">createTableAndWait</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                 byte[]&nbsp;cf)
                                                          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>,
                                                                 <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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 7f0419a..017c26d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -668,11 +668,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.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index 929782e..30841c5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,10 +253,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html b/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
index 7c18a39..c5e4cbd 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.663">TestWALFactory.DumbWALActionsListener</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.664">TestWALFactory.DumbWALActionsListener</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 org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</pre>
 </li>
@@ -220,7 +220,7 @@ implements org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>increments</h4>
-<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.664">increments</a></pre>
+<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.665">increments</a></pre>
 </li>
 </ul>
 </li>
@@ -237,7 +237,7 @@ implements org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DumbWALActionsListener</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.663">DumbWALActionsListener</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.664">DumbWALActionsListener</a>()</pre>
 </li>
 </ul>
 </li>
@@ -254,7 +254,7 @@ implements org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>visitLogEntryBeforeWrite</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.667">visitLogEntryBeforeWrite</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.668">visitLogEntryBeforeWrite</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
                                      org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
                                      org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</pre>
 <dl>
@@ -269,7 +269,7 @@ implements org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>visitLogEntryBeforeWrite</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.672">visitLogEntryBeforeWrite</a>(org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html#line.673">visitLogEntryBeforeWrite</a>(org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
                                      org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html b/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
index d7a510d..b278256 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":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";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.84">TestWALFactory</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.85">TestWALFactory</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">WAL tests that can be reused across providers.</div>
 </li>
@@ -265,41 +265,45 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testDefaultProvider--">testDefaultProvider</a></span>()</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/wal/TestWALFactory.html#testEditAdd--">testEditAdd</a></span>()</code>
 <div class="block">Tests that we can write out an edit, close, and then read it back in again.</div>
 </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/wal/TestWALFactory.html#testOnlySetMetaWALProvider--">testOnlySetMetaWALProvider</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testOnlySetWALProvider--">testOnlySetWALProvider</a></span>()</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/wal/TestWALFactory.html#testSplit--">testSplit</a></span>()</code>
 <div class="block">Just write multiple logs then split.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testVisitors--">testVisitors</a></span>()</code>
 <div class="block">Test that we can visit entries before they are appended</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testWALCoprocessorLoaded--">testWALCoprocessorLoaded</a></span>()</code>
 <div class="block">A loaded WAL coprocessor won't break existing WAL test cases.</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testWALProviders--">testWALProviders</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#verifySplits-java.util.List-int-">verifySplits</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;org.apache.hadoop.fs.Path&gt;&nbsp;splits,
             int&nbsp;howmany)</code>&nbsp;</td>
@@ -332,7 +336,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.87">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.88">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -341,7 +345,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <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/wal/TestWALFactory.html#line.90">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.91">LOG</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -350,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>conf</h4>
-<pre>protected static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.92">conf</a></pre>
+<pre>protected static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.93">conf</a></pre>
 </li>
 </ul>
 <a name="cluster">
@@ -359,7 +363,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cluster</h4>
-<pre>private static&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.93">cluster</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.94">cluster</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -368,7 +372,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>protected static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.94">TEST_UTIL</a></pre>
+<pre>protected static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.95">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="hbaseDir">
@@ -377,7 +381,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hbaseDir</h4>
-<pre>protected static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.95">hbaseDir</a></pre>
+<pre>protected static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.96">hbaseDir</a></pre>
 </li>
 </ul>
 <a name="hbaseWALDir">
@@ -386,7 +390,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hbaseWALDir</h4>
-<pre>protected static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.96">hbaseWALDir</a></pre>
+<pre>protected static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.97">hbaseWALDir</a></pre>
 </li>
 </ul>
 <a name="fs">
@@ -395,7 +399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>fs</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.98">fs</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.99">fs</a></pre>
 </li>
 </ul>
 <a name="dir">
@@ -404,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>dir</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.99">dir</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.100">dir</a></pre>
 </li>
 </ul>
 <a name="wals">
@@ -413,7 +417,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>wals</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.wal.WALFactory <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.100">wals</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.wal.WALFactory <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.101">wals</a></pre>
 </li>
 </ul>
 <a name="currentServername">
@@ -422,7 +426,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>currentServername</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.ServerName <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.101">currentServername</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.ServerName <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.102">currentServername</a></pre>
 </li>
 </ul>
 <a name="currentTest">
@@ -431,7 +435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>currentTest</h4>
-<pre>public final&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.104">currentTest</a></pre>
+<pre>public final&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.105">currentTest</a></pre>
 </li>
 </ul>
 </li>
@@ -448,7 +452,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestWALFactory</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.84">TestWALFactory</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.85">TestWALFactory</a>()</pre>
 </li>
 </ul>
 </li>
@@ -465,7 +469,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.107">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.108">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -479,7 +483,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.115">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.116">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -493,7 +497,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.131">setUpBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.132">setUpBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -507,7 +511,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.162">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.163">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -521,7 +525,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>canCloseSingleton</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.167">canCloseSingleton</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.168">canCloseSingleton</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -535,7 +539,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.177">testSplit</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.178">testSplit</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">Just write multiple logs then split.  Before fix for HADOOP-2283, this
  would fail.</div>
@@ -551,7 +555,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>Broken_testSync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.233">Broken_testSync</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.234">Broken_testSync</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>
 <div class="block">Test new HDFS-265 sync.</div>
 <dl>
@@ -566,7 +570,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifySplits</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.335">verifySplits</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.fs.Path&gt;&nbsp;splits,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.336">verifySplits</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.fs.Path&gt;&nbsp;splits,
                           int&nbsp;howmany)
                    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>
@@ -581,7 +585,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.376">testAppendClose</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.377">testAppendClose</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -595,7 +599,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testEditAdd</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.497">testEditAdd</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.498">testEditAdd</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">Tests that we can write out an edit, close, and then read it back in again.</div>
 <dl>
@@ -610,7 +614,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppend</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.558">testAppend</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.559">testAppend</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -624,7 +628,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testVisitors</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.618">testVisitors</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.619">testVisitors</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>
 <div class="block">Test that we can visit entries before they are appended</div>
 <dl>
@@ -639,7 +643,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWALCoprocessorLoaded</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.656">testWALCoprocessorLoaded</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.657">testWALCoprocessorLoaded</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>
 <div class="block">A loaded WAL coprocessor won't break existing WAL test cases.</div>
 <dl>
@@ -654,7 +658,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWALProviders</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.680">testWALProviders</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.681">testWALProviders</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -668,7 +672,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOnlySetWALProvider</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.696">testOnlySetWALProvider</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.697">testOnlySetWALProvider</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -679,10 +683,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testOnlySetMetaWALProvider--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testOnlySetMetaWALProvider</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.710">testOnlySetMetaWALProvider</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.711">testOnlySetMetaWALProvider</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -690,6 +694,20 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testDefaultProvider--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testDefaultProvider</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.724">testDefaultProvider</a>()
+                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 5282059..b21ae88 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -142,8 +142,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.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>
 </ul>


[17/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
index c658da2..3c4d549 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
@@ -56,710 +56,730 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.Waiter;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.zookeeper.KeeperException;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.junit.After;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.junit.AfterClass;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.junit.BeforeClass;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.junit.ClassRule;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.junit.Test;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.experimental.categories.Category;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.slf4j.Logger;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.slf4j.LoggerFactory;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>@Category(MediumTests.class)<a name="line.95"></a>
-<span class="sourceLineNo">096</span>public class TestNamespaceAuditor {<a name="line.96"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.zookeeper.KeeperException;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.After;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.AfterClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.BeforeClass;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.ClassRule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.slf4j.Logger;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.slf4j.LoggerFactory;<a name="line.96"></a>
 <span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @ClassRule<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static Admin ADMIN;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private String prefix = "TestNamespaceAuditor";<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @BeforeClass<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static void before() throws Exception {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    Configuration conf = UTIL.getConfiguration();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    conf.setStrings(<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      RegionServerObserver.class);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    UTIL.startMiniCluster(1, 1);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    waitForQuotaInitialize(UTIL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static void tearDown() throws Exception {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    UTIL.shutdownMiniCluster();<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>  @After<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void cleanup() throws Exception, KeeperException {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      ADMIN.disableTable(table.getTableName());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      deleteTable(table.getTableName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (ns.getName().startsWith(prefix)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        ADMIN.deleteNamespace(ns.getName());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public void testTableOperations() throws Exception {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    String nsp = prefix + "_np2";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    NamespaceDescriptor nspDesc =<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.147"></a>
-<span class="sourceLineNo">148</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ADMIN.createNamespace(nspDesc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    HTableDescriptor tableDescOne =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    tableDescOne.addFamily(fam1);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    HTableDescriptor tableDescTwo =<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    tableDescTwo.addFamily(fam1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    HTableDescriptor tableDescThree =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    tableDescThree.addFamily(fam1);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    ADMIN.createTable(tableDescOne);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    boolean constraintViolated = false;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    } catch (Exception exp) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      assertTrue(exp instanceof IOException);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      constraintViolated = true;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } finally {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        constraintViolated);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertNotNull(nspState);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    constraintViolated = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    try {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      ADMIN.createTable(tableDescThree);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } catch (Exception exp) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertTrue(exp instanceof IOException);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      constraintViolated = true;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        constraintViolated);<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><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @Test<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  public void testValidQuotas() throws Exception {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    boolean exceptionCaught = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    NamespaceDescriptor nspDesc =<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.198"></a>
-<span class="sourceLineNo">199</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      ADMIN.createNamespace(nspDesc);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } catch (Exception exp) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      LOG.warn(exp.toString(), exp);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      exceptionCaught = true;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    } finally {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      assertTrue(exceptionCaught);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    nspDesc =<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.211"></a>
-<span class="sourceLineNo">212</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      ADMIN.createNamespace(nspDesc);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    } catch (Exception exp) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.warn(exp.toString(), exp);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      exceptionCaught = true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    } finally {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      assertTrue(exceptionCaught);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    nspDesc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      ADMIN.createNamespace(nspDesc);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    } catch (Exception exp) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      LOG.warn(exp.toString(), exp);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      exceptionCaught = true;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    } finally {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      assertTrue(exceptionCaught);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    nspDesc =<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      ADMIN.createNamespace(nspDesc);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    } catch (Exception exp) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      LOG.warn(exp.toString(), exp);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      exceptionCaught = true;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } finally {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      assertTrue(exceptionCaught);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  public void testDeleteTable() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    String namespace = prefix + "_dummy";<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    NamespaceDescriptor nspDesc =<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        NamespaceDescriptor.create(namespace)<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    ADMIN.createNamespace(nspDesc);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HTableDescriptor tableDescOne =<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    tableDescOne.addFamily(fam1);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HTableDescriptor tableDescTwo =<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    tableDescTwo.addFamily(fam1);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    ADMIN.createTable(tableDescOne);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    deleteTable(tableDescOne.getTableName());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    deleteTable(tableDescTwo.getTableName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    ADMIN.deleteNamespace(namespace);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    stateInfo = getNamespaceState(namespace);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    assertNull("Namespace state not found to be null.", stateInfo);<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 static class CPRegionServerObserver<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private volatile boolean shouldFailMerge = false;<a name="line.290"></a>
-<span class="sourceLineNo">291</span><a name="line.291"></a>
-<span class="sourceLineNo">292</span>    public void failMerge(boolean fail) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      shouldFailMerge = fail;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>    private boolean triggered = false;<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      while (!triggered) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        wait();<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><a name="line.303"></a>
-<span class="sourceLineNo">304</span>    @Override<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return Optional.of(this);<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><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private volatile boolean shouldFailMerge = false;<a name="line.311"></a>
+<span class="sourceLineNo">098</span>@Category(MediumTests.class)<a name="line.98"></a>
+<span class="sourceLineNo">099</span>public class TestNamespaceAuditor {<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @ClassRule<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private static Admin ADMIN;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private String prefix = "TestNamespaceAuditor";<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @BeforeClass<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static void before() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Configuration conf = UTIL.getConfiguration();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    conf.setStrings(<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      RegionServerObserver.class);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    UTIL.startMiniCluster(1, 1);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    waitForQuotaInitialize(UTIL);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static void tearDown() throws Exception {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    UTIL.shutdownMiniCluster();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @After<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public void cleanup() throws Exception, KeeperException {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      ADMIN.disableTable(table.getTableName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      deleteTable(table.getTableName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if (ns.getName().startsWith(prefix)) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        ADMIN.deleteNamespace(ns.getName());<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>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void testTableOperations() throws Exception {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    String nsp = prefix + "_np2";<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    NamespaceDescriptor nspDesc =<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    ADMIN.createNamespace(nspDesc);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>    HTableDescriptor tableDescOne =<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    tableDescOne.addFamily(fam1);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    HTableDescriptor tableDescTwo =<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    tableDescTwo.addFamily(fam1);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    HTableDescriptor tableDescThree =<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    tableDescThree.addFamily(fam1);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    ADMIN.createTable(tableDescOne);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    boolean constraintViolated = false;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    try {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    } catch (Exception exp) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      assertTrue(exp instanceof IOException);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      constraintViolated = true;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    } finally {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        constraintViolated);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    assertNotNull(nspState);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    constraintViolated = false;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    try {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      ADMIN.createTable(tableDescThree);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    } catch (Exception exp) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      assertTrue(exp instanceof IOException);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      constraintViolated = true;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        constraintViolated);<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><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @Test<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void testValidQuotas() throws Exception {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    boolean exceptionCaught = false;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    NamespaceDescriptor nspDesc =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    try {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      ADMIN.createNamespace(nspDesc);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception exp) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      LOG.warn(exp.toString(), exp);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      exceptionCaught = true;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } finally {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      assertTrue(exceptionCaught);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    nspDesc =<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.213"></a>
+<span class="sourceLineNo">214</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.214"></a>
+<span class="sourceLineNo">215</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    try {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      ADMIN.createNamespace(nspDesc);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    } catch (Exception exp) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      LOG.warn(exp.toString(), exp);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      exceptionCaught = true;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(exceptionCaught);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    nspDesc =<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      ADMIN.createNamespace(nspDesc);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    } catch (Exception exp) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      LOG.warn(exp.toString(), exp);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      exceptionCaught = true;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    } finally {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertTrue(exceptionCaught);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    nspDesc =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.239"></a>
+<span class="sourceLineNo">240</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    try {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      ADMIN.createNamespace(nspDesc);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } catch (Exception exp) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      LOG.warn(exp.toString(), exp);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      exceptionCaught = true;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    } finally {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      assertTrue(exceptionCaught);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Test<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void testDeleteTable() throws Exception {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    String namespace = prefix + "_dummy";<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    NamespaceDescriptor nspDesc =<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        NamespaceDescriptor.create(namespace)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    ADMIN.createNamespace(nspDesc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    HTableDescriptor tableDescOne =<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    tableDescOne.addFamily(fam1);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    HTableDescriptor tableDescTwo =<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    tableDescTwo.addFamily(fam1);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    ADMIN.createTable(tableDescOne);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    deleteTable(tableDescOne.getTableName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    deleteTable(tableDescTwo.getTableName());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    ADMIN.deleteNamespace(namespace);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    stateInfo = getNamespaceState(namespace);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    assertNull("Namespace state not found to be null.", stateInfo);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  public static class CPRegionServerObserver<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    private volatile boolean shouldFailMerge = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    public void failMerge(boolean fail) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      shouldFailMerge = fail;<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>    private boolean triggered = false;<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      while (!triggered) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        wait();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    @Override<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return Optional.of(this);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    public void failMerge(boolean fail) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      shouldFailMerge = fail;<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>    @Override<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      return Optional.of(this);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    @Override<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    public synchronized void preMergeRegionsAction(<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      notifyAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (shouldFailMerge) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new IOException("fail merge");<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  @Test<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  public void testRegionMerge() throws Exception {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    String nsp1 = prefix + "_regiontest";<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    final int initialRegions = 3;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    NamespaceDescriptor nspDesc =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        NamespaceDescriptor.create(nsp1)<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    ADMIN.createNamespace(nspDesc);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    ADMIN.flush(tableTwo);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    assertEquals(initialRegions, hris.size());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      false);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    f.get(10, TimeUnit.SECONDS);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    regionToSplit.compact(true);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // wait a while to let the ongoing compaction finish.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    UTIL.waitFor(10000, regionToSplit::isSplittable);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    ADMIN.splitRegionAsync(regionToSplit.getRegionInfo().getRegionName(), splitKey).get(10,<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      TimeUnit.SECONDS);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(initialRegions, hris.size());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // Fail region merge through Coprocessor hook<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    MiniHBaseCluster cluster = UTIL.getHBaseCluster();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    MasterCoprocessorHost cpHost = cluster.getMaster().getMasterCoprocessorHost();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Coprocessor coprocessor = cpHost.findCoprocessor(CPMasterObserver.class);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    CPMasterObserver masterObserver = (CPMasterObserver) coprocessor;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    masterObserver.failMerge(true);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    f = ADMIN.mergeRegionsAsync(<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      hris.get(2).getEncodedNameAsBytes(),<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      false);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    try {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      f.get(10, TimeUnit.SECONDS);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      fail("Merge was supposed to fail!");<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    } catch (ExecutionException ee) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      // Expected.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(initialRegions, hris.size());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // verify that we cannot split<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    try {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      fail();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    } catch (DoNotRetryRegionException e) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      // Expected<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    Thread.sleep(2000);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    assertEquals(initialRegions, ADMIN.getRegions(tableTwo).size());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  /*<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   * Create a table and make sure that the table creation fails after adding this table entry into<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * namespace quota cache. Now correct the failure and recreate the table with same name.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * HBASE-13394<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   */<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  @Test<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public void testRecreateTableWithSameNameAfterFirstTimeFailure() throws Exception {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    String nsp1 = prefix + "_testRecreateTable";<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    NamespaceDescriptor nspDesc =<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        NamespaceDescriptor.create(nsp1)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "1").build();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    ADMIN.createNamespace(nspDesc);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    final TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    MasterSyncObserver.throwExceptionInPreCreateTableAction = true;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        ADMIN.createTable(tableDescOne);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        fail("Table " + tableOne.toString() + "creation should fail.");<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      } catch (Exception exp) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        LOG.error(exp.toString(), exp);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      assertFalse(ADMIN.tableExists(tableOne));<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp1);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      assertEquals("First table creation failed in namespace so number of tables in namespace "<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          + "should be 0.", 0, nstate.getTables().size());<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      try {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        ADMIN.createTable(tableDescOne);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      } catch (Exception e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        fail("Table " + tableOne.toString() + "creation should succeed.");<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        LOG.error(e.toString(), e);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertTrue(ADMIN.tableExists(tableOne));<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      nstate = getNamespaceState(nsp1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      assertEquals("First table was created successfully so table size in namespace should "<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          + "be one now.", 1, nstate.getTables().size());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } finally {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      if (ADMIN.tableExists(tableOne)) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        ADMIN.disableTable(tableOne);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        deleteTable(tableOne);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      ADMIN.deleteNamespace(nsp1);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    }<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>  private NamespaceTableAndRegionInfo getNamespaceState(String namespace) throws KeeperException,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getQuotaManager().getState(namespace);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  byte[] getSplitKey(byte[] startKey, byte[] endKey) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    String skey = Bytes.toString(startKey);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    int key;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    if (StringUtils.isBlank(skey)) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      key = Integer.parseInt(Bytes.toString(endKey))/2 ;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    } else {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      key = (int) (Integer.parseInt(skey) * 1.5);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    return Bytes.toBytes("" + key);<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>  public static class CustomObserver implements RegionCoprocessor, RegionObserver {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    volatile CountDownLatch postCompact;<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        throws IOException {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      postCompact.countDown();<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      postCompact = new CountDownLatch(1);<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>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return Optional.of(this);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Test<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public void testStatePreserve() throws Exception {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    final String nsp1 = prefix + "_testStatePreserve";<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp1)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "10").build();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    ADMIN.createNamespace(nspDesc);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    TableName tableThree = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table3");<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    tableDescOne.addFamily(fam1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    HTableDescriptor tableDescTwo = new HTableDescriptor(tableTwo);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    tableDescTwo.addFamily(fam1);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    HTableDescriptor tableDescThree = new HTableDescriptor(tableThree);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    tableDescThree.addFamily(fam1);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    ADMIN.createTable(tableDescThree, Bytes.toBytes("1"), Bytes.toBytes("1000"), 4);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    ADMIN.disableTable(tableThree);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    deleteTable(tableThree);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    // wait for chore to complete<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    UTIL.waitFor(1000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      @Override<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      public boolean evaluate() throws Exception {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>       return (getNamespaceState(nsp1).getTables().size() == 2);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    });<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    NamespaceTableAndRegionInfo before = getNamespaceState(nsp1);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    restartMaster();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    NamespaceTableAndRegionInfo after = getNamespaceState(nsp1);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    assertEquals("Expected: " + before.getTables() + " Found: " + after.getTables(), before<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        .getTables().size(), after.getTables().size());<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void waitForQuotaInitialize(final HBaseTestingUtility util) throws Exception {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    util.waitFor(60000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      public boolean evaluate() throws Exception {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        HMaster master = util.getHBaseCluster().getMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (master == null) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          return false;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        MasterQuotaManager quotaManager = master.getMasterQuotaManager();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        return quotaManager != null &amp;&amp; quotaManager.isQuotaInitialized();<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>  }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  private void restartMaster() throws Exception {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    UTIL.getHBaseCluster().getMaster(0).stop("Stopping to start again");<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    UTIL.getHBaseCluster().waitOnMaster(0);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    UTIL.getHBaseCluster().startMaster();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    waitForQuotaInitialize(UTIL);<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>  private NamespaceAuditor getQuotaManager() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return UTIL.getHBaseCluster().getMaster()<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        .getMasterQuotaManager().getNamespaceQuotaManager();<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>  public static class MasterSyncObserver implements MasterCoprocessor, MasterObserver {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    volatile CountDownLatch tableDeletionLatch;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    static boolean throwExceptionInPreCreateTableAction;<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      return Optional.of(this);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>    @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    public void preDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        TableName tableName) throws IOException {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      tableDeletionLatch = new CountDownLatch(1);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
+<span class="sourceLineNo">313</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private volatile boolean shouldFailMerge = false;<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public void failMerge(boolean fail) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      shouldFailMerge = fail;<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>    @Override<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      return Optional.of(this);<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>    @Override<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    public synchronized void preMergeRegionsAction(<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      notifyAll();<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (shouldFailMerge) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        throw new IOException("fail merge");<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>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  @Test<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public void testRegionMerge() throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    String nsp1 = prefix + "_regiontest";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    final int initialRegions = 3;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    NamespaceDescriptor nspDesc =<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        NamespaceDescriptor.create(nsp1)<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ADMIN.createNamespace(nspDesc);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    ADMIN.flush(tableTwo);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    assertEquals(initialRegions, hris.size());<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      false);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    f.get(10, TimeUnit.SECONDS);<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    regionToSplit.compact(true);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    // Waiting for compaction to finish<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    UTIL.waitFor(30000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      @Override<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      public boolean evaluate() throws Exception {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        return (CompactionState.NONE == ADMIN<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            .getCompactionStateForRegion(regionToSplit.getRegionInfo().getRegionName()));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    });<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // Cleaning compacted references for split to proceed<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    regionToSplit.getStores().stream().forEach(s -&gt; {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      try {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        s.closeAndArchiveCompactedFiles();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      } catch (IOException e1) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        LOG.error("Error whiling cleaning compacted file");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    });<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    // wait a while to let the ongoing compaction finish.<a name="line.389"></a>
+<span class="sourceLineNo">390

<TRUNCATED>

[26/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
index 98653f0..3559952 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -1709,1036 +1709,1046 @@
 <span class="sourceLineNo">1701</span><a name="line.1701"></a>
 <span class="sourceLineNo">1702</span>  @Override<a name="line.1702"></a>
 <span class="sourceLineNo">1703</span>  public boolean hasReferences() {<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    return StoreUtils.hasReferences(this.storeEngine.getStoreFileManager().getStorefiles());<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>  }<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span><a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>  /**<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>   * getter for CompactionProgress object<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>   * @return CompactionProgress object; can be null<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>   */<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>  public CompactionProgress getCompactionProgress() {<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    return this.storeEngine.getCompactor().getProgress();<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>  }<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span><a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>  @Override<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  public boolean shouldPerformMajorCompaction() throws IOException {<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>    for (HStoreFile sf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>      // TODO: what are these reader checks all over the place?<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>      if (sf.getReader() == null) {<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>        LOG.debug("StoreFile {} has null Reader", sf);<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>        return false;<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>      }<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    }<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    return storeEngine.getCompactionPolicy().shouldPerformMajorCompaction(<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>        this.storeEngine.getStoreFileManager().getStorefiles());<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>  }<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>  public Optional&lt;CompactionContext&gt; requestCompaction() throws IOException {<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    return requestCompaction(NO_PRIORITY, CompactionLifeCycleTracker.DUMMY, null);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>  }<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span><a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>  public Optional&lt;CompactionContext&gt; requestCompaction(int priority,<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      CompactionLifeCycleTracker tracker, User user) throws IOException {<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // don't even select for compaction if writes are disabled<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    if (!this.areWritesEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>      return Optional.empty();<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    }<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    // Before we do compaction, try to get rid of unneeded files to simplify things.<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    removeUnneededFiles();<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span><a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    final CompactionContext compaction = storeEngine.createCompaction();<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>    CompactionRequestImpl request = null;<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    this.lock.readLock().lock();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    try {<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      synchronized (filesCompacting) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // First, see if coprocessor would want to override selection.<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        if (this.getCoprocessorHost() != null) {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>          final List&lt;HStoreFile&gt; candidatesForCoproc = compaction.preSelect(this.filesCompacting);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>          boolean override = getCoprocessorHost().preCompactSelection(this,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>              candidatesForCoproc, tracker, user);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>          if (override) {<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>            // Coprocessor is overriding normal file selection.<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>            compaction.forceSelect(new CompactionRequestImpl(candidatesForCoproc));<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>          }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>        }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span><a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        // Normal case - coprocessor is not overriding file selection.<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>        if (!compaction.hasSelection()) {<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>          boolean isUserCompaction = priority == Store.PRIORITY_USER;<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>          boolean mayUseOffPeak = offPeakHours.isOffPeakHour() &amp;&amp;<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>              offPeakCompactionTracker.compareAndSet(false, true);<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>          try {<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>            compaction.select(this.filesCompacting, isUserCompaction,<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>              mayUseOffPeak, forceMajor &amp;&amp; filesCompacting.isEmpty());<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>          } catch (IOException e) {<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>            if (mayUseOffPeak) {<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>              offPeakCompactionTracker.set(false);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>            }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>            throw e;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>          }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          assert compaction.hasSelection();<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          if (mayUseOffPeak &amp;&amp; !compaction.getRequest().isOffPeak()) {<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>            // Compaction policy doesn't want to take advantage of off-peak.<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>            offPeakCompactionTracker.set(false);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>          }<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        }<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>        if (this.getCoprocessorHost() != null) {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>          this.getCoprocessorHost().postCompactSelection(<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>              this, ImmutableList.copyOf(compaction.getRequest().getFiles()), tracker,<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>              compaction.getRequest(), user);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>        }<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>        // Finally, we have the resulting files list. Check if we have any files at all.<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        request = compaction.getRequest();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        Collection&lt;HStoreFile&gt; selectedFiles = request.getFiles();<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>        if (selectedFiles.isEmpty()) {<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          return Optional.empty();<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        }<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span><a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>        addToCompactingFiles(selectedFiles);<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        // If we're enqueuing a major, clear the force flag.<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>        this.forceMajor = this.forceMajor &amp;&amp; !request.isMajor();<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span><a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>        // Set common request properties.<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>        // Set priority, either override value supplied by caller or from store.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>        request.setPriority((priority != Store.NO_PRIORITY) ? priority : getCompactPriority());<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>        request.setDescription(getRegionInfo().getRegionNameAsString(), getColumnFamilyName());<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>        request.setTracker(tracker);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      }<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    } finally {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>      this.lock.readLock().unlock();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    }<a name="line.1802"></a>
+<span class="sourceLineNo">1704</span>    List&lt;HStoreFile&gt; reloadedStoreFiles = null;<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    try {<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>      // Reloading the store files from file system due to HBASE-20940. As split can happen with an<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      // region which has references<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>      reloadedStoreFiles = loadStoreFiles();<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      return StoreUtils.hasReferences(reloadedStoreFiles);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    } catch (IOException ioe) {<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>      LOG.error("Error trying to determine if store has references, assuming references exists",<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>        ioe);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>      return true;<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    }<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  /**<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>   * getter for CompactionProgress object<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>   * @return CompactionProgress object; can be null<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>   */<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public CompactionProgress getCompactionProgress() {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    return this.storeEngine.getCompactor().getProgress();<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>  }<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span><a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>  @Override<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>  public boolean shouldPerformMajorCompaction() throws IOException {<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    for (HStoreFile sf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      // TODO: what are these reader checks all over the place?<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      if (sf.getReader() == null) {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        LOG.debug("StoreFile {} has null Reader", sf);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>        return false;<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>      }<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>    return storeEngine.getCompactionPolicy().shouldPerformMajorCompaction(<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>        this.storeEngine.getStoreFileManager().getStorefiles());<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>  }<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span><a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>  public Optional&lt;CompactionContext&gt; requestCompaction() throws IOException {<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    return requestCompaction(NO_PRIORITY, CompactionLifeCycleTracker.DUMMY, null);<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>  }<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span><a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>  public Optional&lt;CompactionContext&gt; requestCompaction(int priority,<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      CompactionLifeCycleTracker tracker, User user) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // don't even select for compaction if writes are disabled<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    if (!this.areWritesEnabled()) {<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>      return Optional.empty();<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    // Before we do compaction, try to get rid of unneeded files to simplify things.<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    removeUnneededFiles();<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span><a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    final CompactionContext compaction = storeEngine.createCompaction();<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    CompactionRequestImpl request = null;<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    this.lock.readLock().lock();<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    try {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>      synchronized (filesCompacting) {<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>        // First, see if coprocessor would want to override selection.<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        if (this.getCoprocessorHost() != null) {<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>          final List&lt;HStoreFile&gt; candidatesForCoproc = compaction.preSelect(this.filesCompacting);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>          boolean override = getCoprocessorHost().preCompactSelection(this,<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>              candidatesForCoproc, tracker, user);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>          if (override) {<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>            // Coprocessor is overriding normal file selection.<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>            compaction.forceSelect(new CompactionRequestImpl(candidatesForCoproc));<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>          }<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>        }<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>        // Normal case - coprocessor is not overriding file selection.<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>        if (!compaction.hasSelection()) {<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>          boolean isUserCompaction = priority == Store.PRIORITY_USER;<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          boolean mayUseOffPeak = offPeakHours.isOffPeakHour() &amp;&amp;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>              offPeakCompactionTracker.compareAndSet(false, true);<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>          try {<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>            compaction.select(this.filesCompacting, isUserCompaction,<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>              mayUseOffPeak, forceMajor &amp;&amp; filesCompacting.isEmpty());<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>          } catch (IOException e) {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>            if (mayUseOffPeak) {<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>              offPeakCompactionTracker.set(false);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>            }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>            throw e;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>          }<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>          assert compaction.hasSelection();<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>          if (mayUseOffPeak &amp;&amp; !compaction.getRequest().isOffPeak()) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>            // Compaction policy doesn't want to take advantage of off-peak.<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            offPeakCompactionTracker.set(false);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>        if (this.getCoprocessorHost() != null) {<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>          this.getCoprocessorHost().postCompactSelection(<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>              this, ImmutableList.copyOf(compaction.getRequest().getFiles()), tracker,<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>              compaction.getRequest(), user);<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        }<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>        // Finally, we have the resulting files list. Check if we have any files at all.<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>        request = compaction.getRequest();<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>        Collection&lt;HStoreFile&gt; selectedFiles = request.getFiles();<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        if (selectedFiles.isEmpty()) {<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>          return Optional.empty();<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>        }<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        addToCompactingFiles(selectedFiles);<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span><a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>        // If we're enqueuing a major, clear the force flag.<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>        this.forceMajor = this.forceMajor &amp;&amp; !request.isMajor();<a name="line.1802"></a>
 <span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>    if (LOG.isDebugEnabled()) {<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      LOG.debug(getRegionInfo().getEncodedName() + " - " + getColumnFamilyName()<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>          + ": Initiating " + (request.isMajor() ? "major" : "minor") + " compaction"<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>          + (request.isAllFiles() ? " (all files)" : ""));<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    this.region.reportCompactionRequestStart(request.isMajor());<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    return Optional.of(compaction);<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>  }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span><a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>  /** Adds the files to compacting files. filesCompacting must be locked. */<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>  private void addToCompactingFiles(Collection&lt;HStoreFile&gt; filesToAdd) {<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    if (CollectionUtils.isEmpty(filesToAdd)) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      return;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    // Check that we do not try to compact the same StoreFile twice.<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    if (!Collections.disjoint(filesCompacting, filesToAdd)) {<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>      Preconditions.checkArgument(false, "%s overlaps with %s", filesToAdd, filesCompacting);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    filesCompacting.addAll(filesToAdd);<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    Collections.sort(filesCompacting, storeEngine.getStoreFileManager().getStoreFileComparator());<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>  }<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span><a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>  private void removeUnneededFiles() throws IOException {<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (!conf.getBoolean("hbase.store.delete.expired.storefile", true)) return;<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    if (getColumnFamilyDescriptor().getMinVersions() &gt; 0) {<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>      LOG.debug("Skipping expired store file removal due to min version being {}",<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>          getColumnFamilyDescriptor().getMinVersions());<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    this.lock.readLock().lock();<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    Collection&lt;HStoreFile&gt; delSfs = null;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    try {<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>      synchronized (filesCompacting) {<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        long cfTtl = getStoreFileTtl();<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>        if (cfTtl != Long.MAX_VALUE) {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>          delSfs = storeEngine.getStoreFileManager().getUnneededFiles(<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>              EnvironmentEdgeManager.currentTime() - cfTtl, filesCompacting);<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>          addToCompactingFiles(delSfs);<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>        }<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      }<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    } finally {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      this.lock.readLock().unlock();<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span><a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    if (CollectionUtils.isEmpty(delSfs)) {<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return;<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    Collection&lt;HStoreFile&gt; newFiles = Collections.emptyList(); // No new files.<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    writeCompactionWalRecord(delSfs, newFiles);<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    replaceStoreFiles(delSfs, newFiles);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    completeCompaction(delSfs);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    LOG.info("Completed removal of " + delSfs.size() + " unnecessary (expired) file(s) in "<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>        + this + " of " + this.getRegionInfo().getRegionNameAsString()<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>        + "; total size for store is "<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + TraditionalBinaryPrefix.long2String(storeSize.get(), "", 1));<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>  }<a name="line.1860"></a>
+<span class="sourceLineNo">1804</span>        // Set common request properties.<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>        // Set priority, either override value supplied by caller or from store.<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>        request.setPriority((priority != Store.NO_PRIORITY) ? priority : getCompactPriority());<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>        request.setDescription(getRegionInfo().getRegionNameAsString(), getColumnFamilyName());<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        request.setTracker(tracker);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>      }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    } finally {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      this.lock.readLock().unlock();<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span><a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    if (LOG.isDebugEnabled()) {<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>      LOG.debug(getRegionInfo().getEncodedName() + " - " + getColumnFamilyName()<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>          + ": Initiating " + (request.isMajor() ? "major" : "minor") + " compaction"<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>          + (request.isAllFiles() ? " (all files)" : ""));<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    this.region.reportCompactionRequestStart(request.isMajor());<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    return Optional.of(compaction);<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>  }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>  /** Adds the files to compacting files. filesCompacting must be locked. */<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>  private void addToCompactingFiles(Collection&lt;HStoreFile&gt; filesToAdd) {<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (CollectionUtils.isEmpty(filesToAdd)) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    // Check that we do not try to compact the same StoreFile twice.<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    if (!Collections.disjoint(filesCompacting, filesToAdd)) {<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>      Preconditions.checkArgument(false, "%s overlaps with %s", filesToAdd, filesCompacting);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    }<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    filesCompacting.addAll(filesToAdd);<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    Collections.sort(filesCompacting, storeEngine.getStoreFileManager().getStoreFileComparator());<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>  }<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span><a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  private void removeUnneededFiles() throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (!conf.getBoolean("hbase.store.delete.expired.storefile", true)) return;<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    if (getColumnFamilyDescriptor().getMinVersions() &gt; 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      LOG.debug("Skipping expired store file removal due to min version being {}",<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>          getColumnFamilyDescriptor().getMinVersions());<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      return;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    this.lock.readLock().lock();<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    Collection&lt;HStoreFile&gt; delSfs = null;<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    try {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      synchronized (filesCompacting) {<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>        long cfTtl = getStoreFileTtl();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>        if (cfTtl != Long.MAX_VALUE) {<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>          delSfs = storeEngine.getStoreFileManager().getUnneededFiles(<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>              EnvironmentEdgeManager.currentTime() - cfTtl, filesCompacting);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>          addToCompactingFiles(delSfs);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>        }<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>      }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    } finally {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      this.lock.readLock().unlock();<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    }<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    if (CollectionUtils.isEmpty(delSfs)) {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>      return;<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    }<a name="line.1860"></a>
 <span class="sourceLineNo">1861</span><a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>  public void cancelRequestedCompaction(CompactionContext compaction) {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>    finishCompactionRequest(compaction.getRequest());<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>  }<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span><a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>  private void finishCompactionRequest(CompactionRequestImpl cr) {<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    this.region.reportCompactionRequestEnd(cr.isMajor(), cr.getFiles().size(), cr.getSize());<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    if (cr.isOffPeak()) {<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>      offPeakCompactionTracker.set(false);<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>      cr.setOffPeak(false);<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    }<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    synchronized (filesCompacting) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      filesCompacting.removeAll(cr.getFiles());<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>  }<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span><a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  /**<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>   * Validates a store file by opening and closing it. In HFileV2 this should not be an expensive<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>   * operation.<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * @param path the path to the store file<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  private void validateStoreFile(Path path) throws IOException {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    HStoreFile storeFile = null;<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    try {<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>      storeFile = createStoreFileAndReader(path);<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    } catch (IOException e) {<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>      LOG.error("Failed to open store file : {}, keeping it in tmp location", path, e);<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>      throw e;<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    } finally {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>      if (storeFile != null) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>        storeFile.closeStoreFile(false);<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * &lt;p&gt;It works by processing a compaction that's been written to disk.<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   *<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>   * &lt;p&gt;It is usually invoked at the end of a compaction, but might also be<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>   * invoked at HStore startup, if the prior execution died midway through.<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>   *<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>   * &lt;p&gt;Moving the compacted TreeMap into place means:<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>   * &lt;pre&gt;<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * 1) Unload all replaced StoreFile, close and collect list to delete.<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * 2) Compute new store size<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * &lt;/pre&gt;<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   *<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   * @param compactedFiles list of files that were compacted<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>   */<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  @VisibleForTesting<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  protected void completeCompaction(Collection&lt;HStoreFile&gt; compactedFiles)<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    throws IOException {<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    this.storeSize.set(0L);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    this.totalUncompressedBytes.set(0L);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    for (HStoreFile hsf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>      StoreFileReader r = hsf.getReader();<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>      if (r == null) {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>        LOG.warn("StoreFile {} has a null Reader", hsf);<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>        continue;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      this.storeSize.addAndGet(r.length());<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>      this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    }<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /*<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @param wantedVersions How many versions were asked for.<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   * @return wantedVersions or this families' {@link HConstants#VERSIONS}.<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>  int versionsToReturn(final int wantedVersions) {<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    if (wantedVersions &lt;= 0) {<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      throw new IllegalArgumentException("Number of versions must be &gt; 0");<a name="line.1932"></a>
+<span class="sourceLineNo">1862</span>    Collection&lt;HStoreFile&gt; newFiles = Collections.emptyList(); // No new files.<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    writeCompactionWalRecord(delSfs, newFiles);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    replaceStoreFiles(delSfs, newFiles);<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    completeCompaction(delSfs);<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    LOG.info("Completed removal of " + delSfs.size() + " unnecessary (expired) file(s) in "<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>        + this + " of " + this.getRegionInfo().getRegionNameAsString()<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>        + "; total size for store is "<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>        + TraditionalBinaryPrefix.long2String(storeSize.get(), "", 1));<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  public void cancelRequestedCompaction(CompactionContext compaction) {<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    finishCompactionRequest(compaction.getRequest());<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>  private void finishCompactionRequest(CompactionRequestImpl cr) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    this.region.reportCompactionRequestEnd(cr.isMajor(), cr.getFiles().size(), cr.getSize());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    if (cr.isOffPeak()) {<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>      offPeakCompactionTracker.set(false);<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>      cr.setOffPeak(false);<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    synchronized (filesCompacting) {<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>      filesCompacting.removeAll(cr.getFiles());<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    }<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Validates a store file by opening and closing it. In HFileV2 this should not be an expensive<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   * operation.<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>   * @param path the path to the store file<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>   */<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  private void validateStoreFile(Path path) throws IOException {<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    HStoreFile storeFile = null;<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    try {<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>      storeFile = createStoreFileAndReader(path);<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    } catch (IOException e) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>      LOG.error("Failed to open store file : {}, keeping it in tmp location", path, e);<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>      throw e;<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    } finally {<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>      if (storeFile != null) {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>        storeFile.closeStoreFile(false);<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>      }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  }<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span><a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  /**<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * &lt;p&gt;It works by processing a compaction that's been written to disk.<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   *<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * &lt;p&gt;It is usually invoked at the end of a compaction, but might also be<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   * invoked at HStore startup, if the prior execution died midway through.<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>   *<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>   * &lt;p&gt;Moving the compacted TreeMap into place means:<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>   * &lt;pre&gt;<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>   * 1) Unload all replaced StoreFile, close and collect list to delete.<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * 2) Compute new store size<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * &lt;/pre&gt;<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   *<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>   * @param compactedFiles list of files that were compacted<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   */<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  @VisibleForTesting<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>  protected void completeCompaction(Collection&lt;HStoreFile&gt; compactedFiles)<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>    throws IOException {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    this.storeSize.set(0L);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    this.totalUncompressedBytes.set(0L);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    for (HStoreFile hsf : this.storeEngine.getStoreFileManager().getStorefiles()) {<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      StoreFileReader r = hsf.getReader();<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>      if (r == null) {<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        LOG.warn("StoreFile {} has a null Reader", hsf);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>      this.storeSize.addAndGet(r.length());<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.1932"></a>
 <span class="sourceLineNo">1933</span>    }<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    // Make sure we do not return more than maximum versions for this store.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>    int maxVersions = this.family.getMaxVersions();<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return wantedVersions &gt; maxVersions ? maxVersions: wantedVersions;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public boolean canSplit() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    this.lock.readLock().lock();<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    try {<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      boolean result = !hasReferences();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (!result) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>      }<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      return result;<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    } finally {<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      this.lock.readLock().unlock();<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    }<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  }<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span><a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>  /**<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>   * Determines if Store should be split.<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>   */<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>  public Optional&lt;byte[]&gt; getSplitPoint() {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>    this.lock.readLock().lock();<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    try {<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      // Should already be enforced by the split policy!<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      assert !this.getRegionInfo().isMetaRegion();<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (hasReferences()) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        return Optional.empty();<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return this.storeEngine.getStoreFileManager().getSplitPoint();<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    } catch(IOException e) {<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      LOG.warn("Failed getting store size for {}", this, e);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    } finally {<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>      this.lock.readLock().unlock();<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    return Optional.empty();<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  }<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span><a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>  @Override<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>  public long getLastCompactSize() {<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    return this.lastCompactSize;<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>  }<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span><a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>  @Override<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>  public long getSize() {<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>    return storeSize.get();<a name="line.1983"></a>
+<span class="sourceLineNo">1934</span>  }<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span><a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  /*<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * @param wantedVersions How many versions were asked for.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   * @return wantedVersions or this families' {@link HConstants#VERSIONS}.<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>   */<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>  int versionsToReturn(final int wantedVersions) {<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    if (wantedVersions &lt;= 0) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>      throw new IllegalArgumentException("Number of versions must be &gt; 0");<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    }<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Make sure we do not return more than maximum versions for this store.<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    int maxVersions = this.family.getMaxVersions();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    return wantedVersions &gt; maxVersions ? maxVersions: wantedVersions;<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>  }<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  @Override<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>  public boolean canSplit() {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    this.lock.readLock().lock();<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    try {<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      boolean result = !hasReferences();<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>      if (!result) {<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      }<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      return result;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>    } finally {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>      this.lock.readLock().unlock();<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>    }<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>  }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>  /**<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>   * Determines if Store should be split.<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>   */<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>  public Optional&lt;byte[]&gt; getSplitPoint() {<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    this.lock.readLock().lock();<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    try {<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      // Should already be enforced by the split policy!<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      assert !this.getRegionInfo().isMetaRegion();<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>      // Not split-able if we find a reference store file present in the store.<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      if (hasReferences()) {<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>        LOG.trace("Not splittable; has references: {}", this);<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>        return Optional.empty();<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      }<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      return this.storeEngine.getStoreFileManager().getSplitPoint();<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    } catch(IOException e) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      LOG.warn("Failed getting store size for {}", this, e);<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    } finally {<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>      this.lock.readLock().unlock();<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>    }<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    return Optional.empty();<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>  }<a name="line.1984"></a>
 <span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>  public void triggerMajorCompaction() {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    this.forceMajor = true;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>  }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span><a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>  // File administration<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span><a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>  /**<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>   * Return a scanner for both the memstore and the HStore files. Assumes we are not in a<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>   * compaction.<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>   * @param scan Scan to apply when scanning the stores<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>   * @param targetCols columns to scan<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>   * @return a scanner over the current key values<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>   * @throws IOException on failure<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>   */<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>  public KeyValueScanner getScanner(Scan scan, final NavigableSet&lt;byte[]&gt; targetCols, long readPt)<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>      throws IOException {<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    lock.readLock().lock();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    try {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>      ScanInfo scanInfo;<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>      if (this.getCoprocessorHost() != null) {<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>        scanInfo = this.getCoprocessorHost().preStoreScannerOpen(this);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>      } else {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>        scanInfo = getScanInfo();<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>      return createScanner(scan, scanInfo, targetCols, readPt);<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>    } finally {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      lock.readLock().unlock();<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>    }<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>  }<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span><a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  // HMobStore will override this method to return its own implementation.<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>  protected KeyValueScanner createScanner(Scan scan, ScanInfo scanInfo,<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      NavigableSet&lt;byte[]&gt; targetCols, long readPt) throws IOException {<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    return scan.isReversed() ? new ReversedStoreScanner(this, scanInfo, scan, targetCols, readPt)<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>        : new StoreScanner(this, scanInfo, scan, targetCols, readPt);<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>  }<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span><a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>  /**<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>   * Recreates the scanners on the current list of active store file scanners<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>   * @param currentFileScanners the current set of active store file scanners<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>   * @param cacheBlocks cache the blocks or not<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>   * @param usePread use pread or not<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>   * @param isCompaction is the scanner for compaction<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * @param matcher the scan query matcher<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   * @param startRow the scan's start row<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>   * @param includeStartRow should the scan include the start row<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>   * @param stopRow the scan's stop row<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>   * @param includeStopRow should the scan include the stop row<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>   * @param readPt the read point of the current scane<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>   * @param includeMemstoreScanner whether the current scanner should include memstorescanner<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * @return list of scanners recreated on the current Scanners<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   * @throws IOException<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>   */<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>  public List&lt;KeyValueScanner&gt; recreateScanners(List&lt;KeyValueScanner&gt; currentFileScanners,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, ScanQueryMatcher matcher,<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>      byte[] startRow, boolean includeStartRow, byte[] stopRow, boolean includeStopRow, long readPt,<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      boolean includeMemstoreScanner) throws IOException {<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    this.lock.readLock().lock();<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    try {<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      Map&lt;String, HStoreFile&gt; name2File =<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>          new HashMap&lt;&gt;(getStorefilesCount() + getCompactedFilesCount());<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>      for (HStoreFile file : getStorefiles()) {<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>      Collection&lt;HStoreFile&gt; compactedFiles = getCompactedFiles();<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      for (HStoreFile file : IterableUtils.emptyIfNull(compactedFiles)) {<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>      }<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>      List&lt;HStoreFile&gt; filesToReopen = new ArrayList&lt;&gt;();<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      for (KeyValueScanner kvs : currentFileScanners) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>        assert kvs.isFileScanner();<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>        if (kvs.peek() == null) {<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>          continue;<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        }<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        filesToReopen.add(name2File.get(kvs.getFilePath().getName()));<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>      if (filesToReopen.isEmpty()) {<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        return null;<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      }<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>      return getScanners(filesToReopen, cacheBlocks, false, false, matcher, startRow,<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        includeStartRow, stopRow, includeStopRow, readPt, false);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    } finally {<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>      this.lock.readLock().unlock();<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    }<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  @Override<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>  public String toString() {<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>    return this.getColumnFamilyName();<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  }<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span><a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  @Override<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>  public int getStorefilesCount() {<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>    return this.storeEngine.getStoreFileManager().getStorefileCount();<a name="line.2081"></a>
+<span class="sourceLineNo">1986</span>  @Override<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>  public long getLastCompactSize() {<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    return this.lastCompactSize;<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>  }<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span><a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>  @Override<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>  public long getSize() {<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    return storeSize.get();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>  }<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span><a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  public void triggerMajorCompaction() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    this.forceMajor = true;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>  // File administration<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span><a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>  /**<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>   * Return a scanner for both the memstore and the HStore files. Assumes we are not in a<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>   * compaction.<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>   * @param scan Scan to apply when scanning the stores<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>   * @param targetCols columns to scan<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>   * @return a scanner over the current key values<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>   * @throws IOException on failure<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   */<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>  public KeyValueScanner getScanner(Scan scan, final NavigableSet&lt;byte[]&gt; targetCols, long readPt)<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      throws IOException {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>    lock.readLock().lock();<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    try {<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      ScanInfo scanInfo;<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>      if (this.getCoprocessorHost() != null) {<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>        scanInfo = this.getCoprocessorHost().preStoreScannerOpen(this);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      } else {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        scanInfo = getScanInfo();<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      return createScanner(scan, scanInfo, targetCols, readPt);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>    } finally {<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      lock.readLock().unlock();<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span><a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>  // HMobStore will override this method to return its own implementation.<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  protected KeyValueScanner createScanner(Scan scan, ScanInfo scanInfo,<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      NavigableSet&lt;byte[]&gt; targetCols, long readPt) throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    return scan.isReversed() ? new ReversedStoreScanner(this, scanInfo, scan, targetCols, readPt)<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        : new StoreScanner(this, scanInfo, scan, targetCols, readPt);<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  }<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span><a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>  /**<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>   * Recreates the scanners on the current list of active store file scanners<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>   * @param currentFileScanners the current set of active store file scanners<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>   * @param cacheBlocks cache the blocks or not<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>   * @param usePread use pread or not<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>   * @param isCompaction is the scanner for compaction<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>   * @param matcher the scan query matcher<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * @param startRow the scan's start row<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   * @param includeStartRow should the scan include the start row<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>   * @param stopRow the scan's stop row<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>   * @param includeStopRow should the scan include the stop row<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>   * @param readPt the read point of the current scane<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>   * @param includeMemstoreScanner whether the current scanner should include memstorescanner<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>   * @return list of scanners recreated on the current Scanners<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>   * @throws IOException<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>   */<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>  public List&lt;KeyValueScanner&gt; recreateScanners(List&lt;KeyValueScanner&gt; currentFileScanners,<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>      boolean cacheBlocks, boolean usePread, boolean isCompaction, ScanQueryMatcher matcher,<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      byte[] startRow, boolean includeStartRow, byte[] stopRow, boolean includeStopRow, long readPt,<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>      boolean includeMemstoreScanner) throws IOException {<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    this.lock.readLock().lock();<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    try {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>      Map&lt;String, HStoreFile&gt; name2File =<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>          new HashMap&lt;&gt;(getStorefilesCount() + getCompactedFilesCount());<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      for (HStoreFile file : getStorefiles()) {<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      }<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      Collection&lt;HStoreFile&gt; compactedFiles = getCompactedFiles();<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>      for (HStoreFile file : IterableUtils.emptyIfNull(compactedFiles)) {<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        name2File.put(file.getFileInfo().getActiveFileName(), file);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>      List&lt;HStoreFile&gt; filesToReopen = new ArrayList&lt;&gt;();<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      for (KeyValueScanner kvs : currentFileScanners) {<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>        assert kvs.isFileScanner();<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        if (kvs.peek() == null) {<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>          continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>        }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>        filesToReopen.add(name2File.get(kvs.getFilePath().getName()));<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      }<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (filesToReopen.isEmpty()) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        return null;<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>      }<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      return getScanners(filesToReopen, cacheBlocks, false, false, matcher, startRow,<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>        includeStartRow, stopRow, includeStopRow, readPt, false);<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    } finally {<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      this.lock.readLock().unlock();<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    }<a name="line.2081"></a>
 <span class="sourceLineNo">2082</span>  }<a name="line.2082"></a>
 <span class="sourceLineNo">2083</span><a name="line.2083"></a>
 <span class="sourceLineNo">2084</span>  @Override<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>  public int getCompactedFilesCount() {<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    return this.storeEngine.getStoreFileManager().getCompactedFilesCount();<a name="line.2086"></a>
+<span class="sourceLineNo">2085</span>  public String toString() {<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    return this.getColumnFamilyName();<a name="line.2086"></a>
 <span class="sourceLineNo">2087</span>  }<a name="line.2087"></a>
 <span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>  private LongStream getStoreFileAgeStream() {<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>      if (sf.getReader() == null) {<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>        return false;<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>      } else {<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        return true;<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>      }<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    }).filter(HStoreFile::isHFile).mapToLong(sf -&gt; sf.getFileInfo().getCreatedTimestamp())<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        .map(t -&gt; EnvironmentEdgeManager.currentTime() - t);<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  @Override<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  public OptionalLong getMaxStoreFileAge() {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>    return getStoreFileAgeStream().max();<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>  }<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span><a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>  @Override<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>  public OptionalLong getMinStoreFileAge() {<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>    return getStoreFileAgeStream().min();<a name="line.2108"></a>
+<span class="sourceLineNo">2089</span>  @Override<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>  public int getStorefilesCount() {<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    return this.storeEngine.getStoreFileManager().getStorefileCount();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>  }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>  @Override<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>  public int getCompactedFilesCount() {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    return this.storeEngine.getStoreFileManager().getCompactedFilesCount();<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span><a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>  private LongStream getStoreFileAgeStream() {<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      if (sf.getReader() == null) {<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>        return false;<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      } else {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        return true;<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>      }<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    }).filter(HStoreFile::isHFile).mapToLong(sf -&gt; sf.getFileInfo().getCreatedTimestamp())<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>        .map(t -&gt; EnvironmentEdgeManager.currentTime() - t);<a name="line.2108"></a>
 <span class="sourceLineNo">2109</span>  }<a name="line.2109"></a>
 <span class="sourceLineNo">2110</span><a name="line.2110"></a>
 <span class="sourceLineNo">2111</span>  @Override<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>  public OptionalDouble getAvgStoreFileAge() {<a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    return getStoreFileAgeStream().average();<a name="line.2113"></a>
+<span class="sourceLineNo">2112</span>  public OptionalLong getMaxStoreFileAge() {<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>    return getStoreFileAgeStream().max();<a name="line.2113"></a>
 <span class="sourceLineNo">2114</span>  }<a name="line.2114"></a>
 <span class="sourceLineNo">2115</span><a name="line.2115"></a>
 <span class="sourceLineNo">2116</span>  @Override<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>  public long getNumReferenceFiles() {<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream()<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>        .filter(HStoreFile::isReference).count();<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>  }<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>  @Override<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>  public long getNumHFiles() {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream()<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>        .filter(HStoreFile::isHFile).count();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Override<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public long getStoreSizeUncompressed() {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    return this.totalUncompressedBytes.get();<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>  }<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span><a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>  @Override<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>  public long getStorefilesSize() {<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>    // Include all StoreFiles<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    return getStorefilesSize(storeFile -&gt; true);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>  }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>  @Override<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>  public long getHFilesSize() {<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // Include only StoreFiles which are HFiles<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    return getStorefilesSize(storeFile -&gt; storeFile.isHFile());<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>  }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span><a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  private long getStorefilesSize(Predicate&lt;HStoreFile&gt; predicate) {<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>      if (sf.getReader() == null) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        return false;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      } else {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>        return true;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      }<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    }).filter(predicate).mapToLong(sf -&gt; sf.getReader().length()).sum();<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>  }<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span><a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>  private long getStoreFileFieldSize(ToLongFunction&lt;StoreFileReader&gt; f) {<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream().filter(sf -&gt; {<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      if (sf.getReader() == null) {<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>        LOG.warn("StoreFile {} has a null Reader", sf);<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>        return false;<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      } else {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>        return true;<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>      }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    }).map(HStoreFile::getReader).mapToLong(f).sum();<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>  public long getStorefilesRootLevelIndexSize() {<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    return getStoreFileFieldSize(StoreFileReader::indexSize);<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>  }<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span><a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>  @Override<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>  public long getTotalStaticIndexSize() {<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    return getStoreFileFieldSize(StoreFileReader::getUncompressedDataIndexSize);<a name="line.2174"></a>
+<span class="sourceLineNo">2117</span>  public OptionalLong getMinStoreFileAge() {<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    return getStoreFileAgeStream().min();<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>  }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>  @Override<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>  public OptionalDouble getAvgStoreFileAge() {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    return getStoreFileAgeStream().average();<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>  }<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span><a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>  @Override<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  public long getNumReferenceFiles() {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>    return this.storeEngine.getStoreFileManager().getStorefiles().stream()<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        .filter(HStoreFile::isReference).count();<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  }<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span><a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>  @Override<a name="line.2132"></a>
+<span clas

<TRUNCATED>

[21/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index ded7bf5..db20bf7 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index dcc2b49..ce45dc6 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 744b311..d499f26 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -333,7 +333,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 9aabfa6..3d1520f 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -520,7 +520,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-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index ad7f29d..16bc493 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180816" />
+    <meta name="Date-Revision-yyyymmdd" content="20180818" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -748,7 +748,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-08-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-08-18</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 5f10778..a9d8be4 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -32827,6 +32827,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/actions/RemoveColumnAction.html#RemoveColumnAction-org.apache.hadoop.hbase.TableName-java.util.Set-">RemoveColumnAction(TableName, Set&lt;String&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.chaos.actions.<a href="org/apache/hadoop/hbase/chaos/actions/RemoveColumnAction.html" title="class in org.apache.hadoop.hbase.chaos.actions">RemoveColumnAction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#removeCompactedFiles-org.apache.hadoop.hbase.client.Connection-long-org.apache.hadoop.hbase.client.RegionInfo-">removeCompactedFiles(Connection, long, RegionInfo)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html" title="class in org.apache.hadoop.hbase.regionserver">TestEndToEndSplitTransaction</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestAssignmentListener.DummyServerListener.html#removedCount">removedCount</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestAssignmentListener.DummyServerListener.html" title="class in org.apache.hadoop.hbase.master">TestAssignmentListener.DummyServerListener</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#removeExportDir-org.apache.hadoop.fs.Path-">removeExportDir(Path)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshot</a></dt>
@@ -46030,6 +46032,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationChecker.html#testCanPushUnder--">testCanPushUnder()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationChecker.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestSerialReplicationChecker</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html#testCanSplitJustAfterASplit--">testCanSplitJustAfterASplit()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.html" title="class in org.apache.hadoop.hbase.regionserver">TestEndToEndSplitTransaction</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTagUtil.html#testCarryForwardTTLTag--">testCarryForwardTTLTag()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTagUtil.html" title="class in org.apache.hadoop.hbase">TestTagUtil</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/TestRegexComparator.TestCase.html#TestCase-java.lang.String-java.lang.String-boolean-">TestCase(String, String, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/TestRegexComparator.TestCase.html" title="class in org.apache.hadoop.hbase.filter">TestRegexComparator.TestCase</a></dt>
@@ -48442,6 +48446,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/TestCipherProvider.html#testDefaultProvider--">testDefaultProvider()</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.<a href="org/apache/hadoop/hbase/io/crypto/TestCipherProvider.html" title="class in org.apache.hadoop.hbase.io.crypto">TestCipherProvider</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALFactory.html#testDefaultProvider--">testDefaultProvider()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALFactory.html" title="class in org.apache.hadoop.hbase.wal">TestWALFactory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientClusterMetrics.html#testDefaults--">testDefaults()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientClusterMetrics.html" title="class in org.apache.hadoop.hbase">TestClientClusterMetrics</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientClusterStatus.html#testDefaults--">testDefaults()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientClusterStatus.html" title="class in org.apache.hadoop.hbase">TestClientClusterStatus</a></dt>
@@ -55494,6 +55500,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestNamespacesResource.html#testNamespacesModel">testNamespacesModel</a></span> - Static variable in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestNamespacesResource.html" title="class in org.apache.hadoop.hbase.rest">TestNamespacesResource</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testNamespaceSpaceAndRPCQuotaRemoved--">testNamespaceSpaceAndRPCQuotaRemoved()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotasObserver</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testNamespaceSpaceQuotaRemoved--">testNamespaceSpaceQuotaRemoved()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotasObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/rest/TestNamespacesResource.html" title="class in org.apache.hadoop.hbase.rest"><span class="typeNameLink">TestNamespacesResource</span></a> - Class in <a href="org/apache/hadoop/hbase/rest/package-summary.html">org.apache.hadoop.hbase.rest</a></dt>
@@ -62268,6 +62276,8 @@
 <dd>
 <div class="block">Validate that we can handle valid tables with '.', '_', and '-' chars.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHStoreFile.html#testStoreFileReference--">testStoreFileReference()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">TestHStoreFile</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#testStoreFileReferenceCreationWhenSplitPolicySaysToSkipRangeCheck--">testStoreFileReferenceCreationWhenSplitPolicySaysToSkipRangeCheck()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html" title="class in org.apache.hadoop.hbase.regionserver">TestSplitTransactionOnCluster</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestStoreFileRefresherChore</span></a> - Class in <a href="org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></dt>
@@ -62980,6 +62990,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#TestTableSnapshotScanner--">TestTableSnapshotScanner()</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html" title="class in org.apache.hadoop.hbase.client">TestTableSnapshotScanner</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testTableSpaceAndRPCQuotaRemoved--">testTableSpaceAndRPCQuotaRemoved()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotasObserver</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html#testTableSpaceQuotaRemoved--">testTableSpaceQuotaRemoved()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestMasterQuotasObserver.html" title="class in org.apache.hadoop.hbase.quotas">TestMasterQuotasObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/quotas/TestTableSpaceQuotaViolationNotifier.html" title="class in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">TestTableSpaceQuotaViolationNotifier</span></a> - Class in <a href="org/apache/hadoop/hbase/quotas/package-summary.html">org.apache.hadoop.hbase.quotas</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
index 17deead..c5458bf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.61">TestAsyncTableGetMultiThreaded</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.63">TestAsyncTableGetMultiThreaded</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">Will split the table, and move region randomly when testing.</div>
 </li>
@@ -250,7 +250,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.64">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.66">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -259,7 +259,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.67">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.69">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="TABLE_NAME">
@@ -268,7 +268,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_NAME</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.69">TABLE_NAME</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.71">TABLE_NAME</a></pre>
 </li>
 </ul>
 <a name="FAMILY">
@@ -277,7 +277,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>FAMILY</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.71">FAMILY</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.73">FAMILY</a></pre>
 </li>
 </ul>
 <a name="QUALIFIER">
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>QUALIFIER</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.73">QUALIFIER</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.75">QUALIFIER</a></pre>
 </li>
 </ul>
 <a name="COUNT">
@@ -295,7 +295,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>COUNT</h4>
-<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.75">COUNT</a></pre>
+<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.77">COUNT</a></pre>
 </li>
 </ul>
 <a name="CONN">
@@ -304,7 +304,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CONN</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.77">CONN</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.79">CONN</a></pre>
 </li>
 </ul>
 <a name="TABLE">
@@ -313,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.79">TABLE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.81">TABLE</a></pre>
 </li>
 </ul>
 <a name="SPLIT_KEYS">
@@ -322,7 +322,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SPLIT_KEYS</h4>
-<pre>private static&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.81">SPLIT_KEYS</a></pre>
+<pre>private static&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.83">SPLIT_KEYS</a></pre>
 </li>
 </ul>
 </li>
@@ -339,7 +339,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestAsyncTableGetMultiThreaded</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.61">TestAsyncTableGetMultiThreaded</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.63">TestAsyncTableGetMultiThreaded</a>()</pre>
 </li>
 </ul>
 </li>
@@ -356,7 +356,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.84">setUp</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.86">setUp</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -370,7 +370,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.88">setUp</a>(org.apache.hadoop.hbase.MemoryCompactionPolicy&nbsp;memoryCompaction)
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.90">setUp</a>(org.apache.hadoop.hbase.MemoryCompactionPolicy&nbsp;memoryCompaction)
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -384,7 +384,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.112">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.114">tearDown</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -398,7 +398,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.117">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a>&nbsp;stop)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.119">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a>&nbsp;stop)
           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>,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a></pre>
 <dl>
@@ -414,15 +414,11 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>test</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.127">test</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>,
-                 <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>,
-                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a></pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.html#line.129">test</a>()
+          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
-<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
-<dd><code><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></code></dd>
-<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a></code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
 </dl>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html b/testdevapidocs/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
index a05ae94..6d4f777 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html
@@ -510,7 +510,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.116">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.120">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -524,7 +524,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowKey</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.120">getRowKey</a>(int&nbsp;batchId,
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.124">getRowKey</a>(int&nbsp;batchId,
                                 int&nbsp;i)</pre>
 </li>
 </ul>
@@ -534,7 +534,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getQualifier</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.124">getQualifier</a>(int&nbsp;j)</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.128">getQualifier</a>(int&nbsp;j)</pre>
 </li>
 </ul>
 <a name="getValue-int-int-int-">
@@ -543,7 +543,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getValue</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.128">getValue</a>(int&nbsp;batchId,
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.132">getValue</a>(int&nbsp;batchId,
                                int&nbsp;i,
                                int&nbsp;j)</pre>
 </li>
@@ -554,7 +554,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeTestDataBatch</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.133">writeTestDataBatch</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.137">writeTestDataBatch</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                int&nbsp;batchId)
                         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>
@@ -569,7 +569,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyTestDataBatch</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.151">verifyTestDataBatch</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.155">verifyTestDataBatch</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                 int&nbsp;batchId)
                          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>
@@ -584,7 +584,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSomeNewData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.169">writeSomeNewData</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.173">writeSomeNewData</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -598,7 +598,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyAllData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.174">verifyAllData</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.178">verifyAllData</a>()
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -612,7 +612,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setEncodingConf</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.180">setEncodingConf</a>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;encoding,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.184">setEncodingConf</a>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;encoding,
                              boolean&nbsp;onlineChange)
                       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>
@@ -627,7 +627,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testChangingEncoding</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.202">testChangingEncoding</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.206">testChangingEncoding</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -641,7 +641,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testChangingEncodingWithCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.214">testChangingEncodingWithCompaction</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.218">testChangingEncodingWithCompaction</a>()
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -655,7 +655,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compactAndWait</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.227">compactAndWait</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.231">compactAndWait</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>,
                             <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>
 <dl>
@@ -671,7 +671,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testCrazyRandomChanges</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.248">testCrazyRandomChanges</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#line.252">testCrazyRandomChanges</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
index 17d5865..479deac 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.310">TestNamespaceAuditor.CPMasterObserver</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.313">TestNamespaceAuditor.CPMasterObserver</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 org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.hadoop.hbase.coprocessor.MasterObserver</pre>
 </li>
@@ -251,7 +251,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>shouldFailMerge</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.311">shouldFailMerge</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.314">shouldFailMerge</a></pre>
 </li>
 </ul>
 </li>
@@ -268,7 +268,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CPMasterObserver</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.310">CPMasterObserver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.313">CPMasterObserver</a>()</pre>
 </li>
 </ul>
 </li>
@@ -285,7 +285,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>failMerge</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.313">failMerge</a>(boolean&nbsp;fail)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.316">failMerge</a>(boolean&nbsp;fail)</pre>
 </li>
 </ul>
 <a name="getMasterObserver--">
@@ -294,7 +294,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterObserver</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.MasterObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.318">getMasterObserver</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.MasterObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.321">getMasterObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getMasterObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.MasterCoprocessor</code></dd>
@@ -307,7 +307,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>preMergeRegionsAction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.323">preMergeRegionsAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPMasterObserver.html#line.326">preMergeRegionsAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
                                   org.apache.hadoop.hbase.client.RegionInfo[]&nbsp;regionsToMerge)
                            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/7cafc412/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
index a14b471..a9890ac 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.288">TestNamespaceAuditor.CPRegionServerObserver</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.291">TestNamespaceAuditor.CPRegionServerObserver</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 org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionServerObserver</pre>
 </li>
@@ -254,7 +254,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor, org.apac
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldFailMerge</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.290">shouldFailMerge</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.293">shouldFailMerge</a></pre>
 </li>
 </ul>
 <a name="triggered">
@@ -263,7 +263,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor, org.apac
 <ul class="blockListLast">
 <li class="blockList">
 <h4>triggered</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.296">triggered</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.299">triggered</a></pre>
 </li>
 </ul>
 </li>
@@ -280,7 +280,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor, org.apac
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CPRegionServerObserver</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.288">CPRegionServerObserver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.291">CPRegionServerObserver</a>()</pre>
 </li>
 </ul>
 </li>
@@ -297,7 +297,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor, org.apac
 <ul class="blockList">
 <li class="blockList">
 <h4>failMerge</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.292">failMerge</a>(boolean&nbsp;fail)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.295">failMerge</a>(boolean&nbsp;fail)</pre>
 </li>
 </ul>
 <a name="waitUtilTriggered--">
@@ -306,7 +306,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor, org.apac
 <ul class="blockList">
 <li class="blockList">
 <h4>waitUtilTriggered</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.298">waitUtilTriggered</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.301">waitUtilTriggered</a>()
                        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>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -320,7 +320,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor, org.apac
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionServerObserver</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.RegionServerObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.305">getRegionServerObserver</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.RegionServerObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html#line.308">getRegionServerObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getRegionServerObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
index 61d2c52..d273677 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.476">TestNamespaceAuditor.CustomObserver</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.496">TestNamespaceAuditor.CustomObserver</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 org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver</pre>
 </li>
@@ -268,7 +268,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>postCompact</h4>
-<pre>volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.477">postCompact</a></pre>
+<pre>volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.497">postCompact</a></pre>
 </li>
 </ul>
 </li>
@@ -285,7 +285,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CustomObserver</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.476">CustomObserver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.496">CustomObserver</a>()</pre>
 </li>
 </ul>
 </li>
@@ -302,7 +302,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>postCompact</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.480">postCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.500">postCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                         org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                         org.apache.hadoop.hbase.regionserver.StoreFile&nbsp;resultFile,
                         org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
@@ -322,7 +322,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.487">start</a>(org.apache.hadoop.hbase.CoprocessorEnvironment&nbsp;e)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.507">start</a>(org.apache.hadoop.hbase.CoprocessorEnvironment&nbsp;e)
            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>
@@ -338,7 +338,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionObserver</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.492">getRegionObserver</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html#line.512">getRegionObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getRegionObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionCoprocessor</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
index 2422b37..cd53117 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.559">TestNamespaceAuditor.MasterSyncObserver</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.579">TestNamespaceAuditor.MasterSyncObserver</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 org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.hadoop.hbase.coprocessor.MasterObserver</pre>
 </li>
@@ -262,7 +262,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>tableDeletionLatch</h4>
-<pre>volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.560">tableDeletionLatch</a></pre>
+<pre>volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.580">tableDeletionLatch</a></pre>
 </li>
 </ul>
 <a name="throwExceptionInPreCreateTableAction">
@@ -271,7 +271,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>throwExceptionInPreCreateTableAction</h4>
-<pre>static&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.561">throwExceptionInPreCreateTableAction</a></pre>
+<pre>static&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.581">throwExceptionInPreCreateTableAction</a></pre>
 </li>
 </ul>
 </li>
@@ -288,7 +288,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MasterSyncObserver</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.559">MasterSyncObserver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.579">MasterSyncObserver</a>()</pre>
 </li>
 </ul>
 </li>
@@ -305,7 +305,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterObserver</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.MasterObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.564">getMasterObserver</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;org.apache.hadoop.hbase.coprocessor.MasterObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.584">getMasterObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getMasterObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.MasterCoprocessor</code></dd>
@@ -318,7 +318,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>preDeleteTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.569">preDeleteTable</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.589">preDeleteTable</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
                            org.apache.hadoop.hbase.TableName&nbsp;tableName)
                     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>
@@ -335,7 +335,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockList">
 <li class="blockList">
 <h4>postCompletedDeleteTableAction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.575">postCompletedDeleteTableAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.595">postCompletedDeleteTableAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
                                            org.apache.hadoop.hbase.TableName&nbsp;tableName)
                                     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>
@@ -352,7 +352,7 @@ implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.had
 <ul class="blockListLast">
 <li class="blockList">
 <h4>preCreateTableAction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.582">preCreateTableAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html#line.602">preCreateTableAction</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;&nbsp;ctx,
                                  org.apache.hadoop.hbase.client.TableDescriptor&nbsp;desc,
                                  org.apache.hadoop.hbase.client.RegionInfo[]&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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
index 966a1e5..4c392d2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.96">TestNamespaceAuditor</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.99">TestNamespaceAuditor</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>
@@ -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>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.99">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.102">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -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>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.102">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.105">LOG</a></pre>
 </li>
 </ul>
 <a name="UTIL">
@@ -339,7 +339,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.103">UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.106">UTIL</a></pre>
 </li>
 </ul>
 <a name="ADMIN">
@@ -348,7 +348,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ADMIN</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.104">ADMIN</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.107">ADMIN</a></pre>
 </li>
 </ul>
 <a name="prefix">
@@ -357,7 +357,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>prefix</h4>
-<pre>private&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/namespace/TestNamespaceAuditor.html#line.105">prefix</a></pre>
+<pre>private&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/namespace/TestNamespaceAuditor.html#line.108">prefix</a></pre>
 </li>
 </ul>
 </li>
@@ -374,7 +374,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestNamespaceAuditor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.96">TestNamespaceAuditor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.99">TestNamespaceAuditor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -391,7 +391,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>before</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.108">before</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.111">before</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -405,7 +405,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.124">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.127">tearDown</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -419,7 +419,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.129">cleanup</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.132">cleanup</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>,
                     org.apache.zookeeper.KeeperException</pre>
 <dl>
@@ -435,7 +435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTableOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.144">testTableOperations</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.147">testTableOperations</a>()
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -449,7 +449,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testValidQuotas</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.192">testValidQuotas</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.195">testValidQuotas</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -463,7 +463,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.251">testDeleteTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.254">testDeleteTable</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -477,7 +477,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionMerge</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.334">testRegionMerge</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.337">testRegionMerge</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -491,7 +491,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecreateTableWithSameNameAfterFirstTimeFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.414">testRecreateTableWithSameNameAfterFirstTimeFailure</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.434">testRecreateTableWithSameNameAfterFirstTimeFailure</a>()
                                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -505,7 +505,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNamespaceState</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.namespace.NamespaceTableAndRegionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.460">getNamespaceState</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;namespace)
+<pre>private&nbsp;org.apache.hadoop.hbase.namespace.NamespaceTableAndRegionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.480">getNamespaceState</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;namespace)
                                                                                  throws org.apache.zookeeper.KeeperException,
                                                                                         <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>
@@ -521,7 +521,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSplitKey</h4>
-<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.465">getSplitKey</a>(byte[]&nbsp;startKey,
+<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.485">getSplitKey</a>(byte[]&nbsp;startKey,
                    byte[]&nbsp;endKey)</pre>
 </li>
 </ul>
@@ -531,7 +531,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStatePreserve</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.498">testStatePreserve</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.518">testStatePreserve</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -545,7 +545,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForQuotaInitialize</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.533">waitForQuotaInitialize</a>(<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;util)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.553">waitForQuotaInitialize</a>(<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;util)
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -559,7 +559,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restartMaster</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.547">restartMaster</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.567">restartMaster</a>()
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -573,7 +573,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getQuotaManager</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.namespace.NamespaceAuditor&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.554">getQuotaManager</a>()</pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.namespace.NamespaceAuditor&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.574">getQuotaManager</a>()</pre>
 </li>
 </ul>
 <a name="deleteTable-org.apache.hadoop.hbase.TableName-">
@@ -582,7 +582,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.590">deleteTable</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.610">deleteTable</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -596,7 +596,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testExceedTableQuotaInNamespace</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.600">testExceedTableQuotaInNamespace</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.620">testExceedTableQuotaInNamespace</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -610,7 +610,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloneSnapshotQuotaExceed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.620">testCloneSnapshotQuotaExceed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.640">testCloneSnapshotQuotaExceed</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -624,7 +624,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloneSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.640">testCloneSnapshot</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.660">testCloneSnapshot</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -638,7 +638,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRestoreSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.678">testRestoreSnapshot</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.698">testRestoreSnapshot</a>()
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -652,7 +652,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRestoreSnapshotQuotaExceed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.714">testRestoreSnapshotQuotaExceed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.html#line.734">testRestoreSnapshotQuotaExceed</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 5347145..62e9459 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -576,12 +576,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.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>


[04/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
index a369370..295a1d4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMasterRpcServices.html
@@ -39,989 +39,1006 @@
 <span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.Optional;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.ServerName;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Get;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Put;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Table;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.zookeeper.KeeperException;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.After;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.junit.AfterClass;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.junit.Assert;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.junit.Before;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.junit.BeforeClass;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.junit.ClassRule;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.junit.Rule;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.junit.Test;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.junit.experimental.categories.Category;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.junit.rules.TestName;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.slf4j.Logger;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.slf4j.LoggerFactory;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * The below tests are testing split region against a running cluster<a name="line.113"></a>
-<span class="sourceLineNo">114</span> */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.115"></a>
-<span class="sourceLineNo">116</span>@SuppressWarnings("deprecation")<a name="line.116"></a>
-<span class="sourceLineNo">117</span>public class TestSplitTransactionOnCluster {<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @ClassRule<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private Admin admin = null;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private MiniHBaseCluster cluster = null;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static final int NB_SERVERS = 3;<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    new HBaseTestingUtility();<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  @Rule<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  public TestName name = new TestName();<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @BeforeClass public static void before() throws Exception {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  @AfterClass public static void after() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TESTING_UTIL.shutdownMiniCluster();<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>  @Before public void setup() throws IOException {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  @After<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  public void tearDown() throws Exception {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    this.admin.close();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      TESTING_UTIL.deleteTable(htd.getTableName());<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>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throws IOException, InterruptedException {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(1, regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    try {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchProcedureException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return hri;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private void requestSplitRegion(<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      final HRegionServer rsServer,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      final Region region,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      final byte[] midKey) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testRITStateForRollback() throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    final HMaster master = cluster.getMaster();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      // Create table then get the single region for our new table.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      insertData(tableName, admin, t);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      t.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      this.admin.setBalancerRunning(false, true);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      master.setCatalogJanitorEnabled(false);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // find a splittable region<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      final HRegion region = findSplittableRegion(regions);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // install master co-processor to fail splits<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      master.getMasterCoprocessorHost().load(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        FailingSplitMasterObserver.class,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        Coprocessor.PRIORITY_USER,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        master.getConfiguration());<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // split async<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      FailingSplitMasterObserver observer =<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      assertNotNull(observer);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      observer.latch.await();<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        Threads.sleep(100);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      admin.setBalancerRunning(true, false);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      master.setCatalogJanitorEnabled(true);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      abortAndWaitForMaster();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      TESTING_UTIL.deleteTable(tableName);<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  @Test<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // Create table then get the single region for our new table.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    admin.createTable(htd);<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Thread.sleep(100);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    HStore store = region.getStore(cf);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // insert data<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    insertData(tableName, admin, t);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    insertData(tableName, admin, t);<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int fileNum = store.getStorefiles().size();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // 0, Compaction Request<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    store.triggerMajorCompaction();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertTrue(cc.isPresent());<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // 1, A timeout split<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    // 1.1 close region<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // 1.2 rollback and Region initialize again<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    region.initialize();<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // 2, Run Compaction cc<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // 3, Split<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    volatile CountDownLatch latch;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      latch = new CountDownLatch(1);<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>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return Optional.of(this);<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>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void preSplitRegionBeforeMETAAction(<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        final byte[] splitKey,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      latch.countDown();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      throw new IOException("Causing rollback of region split");<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><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  @Test<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    // Create table then get the single region for our new table.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.305"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.conf.Configuration;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.FileSystem;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.fs.Path;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.ServerName;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Get;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Put;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Result;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Table;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.zookeeper.KeeperException;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.junit.After;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.junit.AfterClass;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.junit.Assert;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.junit.Before;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.junit.BeforeClass;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.junit.ClassRule;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.junit.Rule;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.junit.Test;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.junit.experimental.categories.Category;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.junit.rules.TestName;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.slf4j.Logger;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.slf4j.LoggerFactory;<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> * The below tests are testing split region against a running cluster<a name="line.115"></a>
+<span class="sourceLineNo">116</span> */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.117"></a>
+<span class="sourceLineNo">118</span>@SuppressWarnings("deprecation")<a name="line.118"></a>
+<span class="sourceLineNo">119</span>public class TestSplitTransactionOnCluster {<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  @ClassRule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private Admin admin = null;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private MiniHBaseCluster cluster = null;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static final int NB_SERVERS = 3;<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    new HBaseTestingUtility();<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Rule<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public TestName name = new TestName();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @BeforeClass public static void before() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @AfterClass public static void after() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    TESTING_UTIL.shutdownMiniCluster();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Before public void setup() throws IOException {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @After<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public void tearDown() throws Exception {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    this.admin.close();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      TESTING_UTIL.deleteTable(htd.getTableName());<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      throws IOException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertEquals(1, regions.size());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    try {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    } catch (NoSuchProcedureException e) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return hri;<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>  private void requestSplitRegion(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      final HRegionServer rsServer,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      final Region region,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      final byte[] midKey) throws IOException {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<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>  @Test<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  public void testRITStateForRollback() throws Exception {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    final HMaster master = cluster.getMaster();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      // Create table then get the single region for our new table.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      insertData(tableName, admin, t);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      t.close();<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      this.admin.setBalancerRunning(false, true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      master.setCatalogJanitorEnabled(false);<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // find a splittable region<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      final HRegion region = findSplittableRegion(regions);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>      // install master co-processor to fail splits<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      master.getMasterCoprocessorHost().load(<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        FailingSplitMasterObserver.class,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        Coprocessor.PRIORITY_USER,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        master.getConfiguration());<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // split async<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FailingSplitMasterObserver observer =<a name="line.213"></a>
+<span class="sourceLineNo">214</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      assertNotNull(observer);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      observer.latch.await();<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        Threads.sleep(100);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } finally {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      admin.setBalancerRunning(true, false);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      master.setCatalogJanitorEnabled(true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      abortAndWaitForMaster();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      TESTING_UTIL.deleteTable(tableName);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  @Test<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // Create table then get the single region for our new table.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    admin.createTable(htd);<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      Thread.sleep(100);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    HStore store = region.getStore(cf);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // insert data<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    insertData(tableName, admin, t);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    insertData(tableName, admin, t);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    int fileNum = store.getStorefiles().size();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // 0, Compaction Request<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    store.triggerMajorCompaction();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    assertTrue(cc.isPresent());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // 1, A timeout split<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // 1.1 close region<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // 1.2 rollback and Region initialize again<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    region.initialize();<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // 2, Run Compaction cc<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // 3, Split<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    volatile CountDownLatch latch;<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    @Override<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      latch = new CountDownLatch(1);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return Optional.of(this);<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>    @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    public void preSplitRegionBeforeMETAAction(<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        final byte[] splitKey,<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      latch.countDown();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      throw new IOException("Causing rollback of region split");<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // Create table then get the single region for our new table.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.305"></a>
 <span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.307"></a>
+<span class="sourceLineNo">307</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.307"></a>
 <span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.admin.setBalancerRunning(false, true);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // Add a bit of load up into the table so splittable.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Get region pre-split.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      printOutRegions(server, "Initial regions: ");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // rollback.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // split transaction. Catch the exception instead.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      try {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        fail();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      } catch (DoNotRetryRegionException e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        // Expected<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Wait around a while and assert count of regions remains constant.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        Thread.sleep(100);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // Now try splitting and it should work.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      split(hri, server, regionCount);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      // Get daughters<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      checkAndGetDaughters(tableName);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      // OK, so split happened after we cleared the blocking node.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    } finally {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      admin.setBalancerRunning(true, false);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      t.close();<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><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @throws IOException<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @throws InterruptedException<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  @Test<a name="line.356"></a>
-<span class="sourceLineNo">357</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Create table then get the single region for our new table.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.365"></a>
+<span class="sourceLineNo">309</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    this.admin.setBalancerRunning(false, true);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Add a bit of load up into the table so splittable.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // Get region pre-split.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      printOutRegions(server, "Initial regions: ");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // rollback.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      // split transaction. Catch the exception instead.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        fail();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      } catch (DoNotRetryRegionException e) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        // Expected<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // Wait around a while and assert count of regions remains constant.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        Thread.sleep(100);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      // Now try splitting and it should work.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      split(hri, server, regionCount);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      // Get daughters<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      checkAndGetDaughters(tableName);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      // OK, so split happened after we cleared the blocking node.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } finally {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      admin.setBalancerRunning(true, false);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      t.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<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>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @throws IOException<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @throws InterruptedException<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  @Test<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // Create table then get the single region for our new table.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.365"></a>
 <span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    this.admin.setBalancerRunning(false, true);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    try {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      // Add a bit of load up into the table so splittable.<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Get region pre-split.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      printOutRegions(server, "Initial regions: ");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      // Now split.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      split(hri, server, regionCount);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      // Get daughters<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // Now split one of the daughters.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      RegionInfo daughter = daughters.get(0).getRegionInfo();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.info("Daughter we are going to split: " + daughter);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Compact first to ensure we have cleaned up references -- else the split<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // will fail.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      this.admin.compactRegion(daughter.getRegionName());<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      daughters = cluster.getRegions(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      HRegion daughterRegion = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      for (HRegion r: daughters) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        if (RegionInfo.COMPARATOR.compare(r.getRegionInfo(), daughter) == 0) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          daughterRegion = r;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          LOG.info("Found matching HRI: " + daughterRegion);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          break;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      assertTrue(daughterRegion != null);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      for (int i=0; i&lt;100; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        if (!daughterRegion.hasReferences()) break;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Threads.sleep(100);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      assertFalse("Waiting for reference to be compacted", daughterRegion.hasReferences());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      LOG.info("Daughter hri before split (has been compacted): " + daughter);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      split(daughter, server, regionCount);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // Get list of daughters<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      daughters = cluster.getRegions(tableName);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      for (HRegion d: daughters) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        LOG.info("Regions before crash: " + d);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Now crash the server<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      cluster.abortRegionServer(tableRegionIndex);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      waitUntilRegionServerDead();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      awaitDaughters(tableName, daughters.size());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      // Assert daughters are online and ONLY the original daughters -- that<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      // fixup didn't insert one during server shutdown recover.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      regions = cluster.getRegions(tableName);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      for (HRegion d: daughters) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        LOG.info("Regions after crash: " + d);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (daughters.size() != regions.size()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        LOG.info("Daughters=" + daughters.size() + ", regions=" + regions.size());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      assertEquals(daughters.size(), regions.size());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      for (HRegion r: regions) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        LOG.info("Regions post crash " + r + ", contains=" + daughters.contains(r));<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        assertTrue("Missing region post crash " + r, daughters.contains(r));<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      LOG.info("EXITING");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      admin.setBalancerRunning(true, false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      t.close();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @Test<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles() throws Exception {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    TableName userTableName = TableName.valueOf(name.getMethodName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    HTableDescriptor htd = new HTableDescriptor(userTableName);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    HColumnDescriptor hcd = new HColumnDescriptor("col");<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    htd.addFamily(hcd);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    admin.createTable(htd);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    Table table = TESTING_UTIL.getConnection().getTable(userTableName);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      for (int i = 0; i &lt;= 5; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        String row = "row" + i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Put p = new Put(row.getBytes());<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        String val = "Val" + i;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        p.addColumn("col".getBytes(), "ql".getBytes(), val.getBytes());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        table.put(p);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        admin.flush(userTableName);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        Delete d = new Delete(row.getBytes());<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        // Do a normal delete<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        table.delete(d);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        admin.flush(userTableName);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      admin.majorCompact(userTableName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      List&lt;RegionInfo&gt; regionsOfTable =<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          cluster.getMaster().getAssignmentManager().getRegionStates()<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          .getRegionsOfTable(userTableName);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(1, regionsOfTable.size());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      RegionInfo hRegionInfo = regionsOfTable.get(0);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      Put p = new Put("row6".getBytes());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      table.put(p);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      p = new Put("row7".getBytes());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      table.put(p);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      p = new Put("row8".getBytes());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      table.put(p);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      admin.flush(userTableName);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      admin.splitRegion(hRegionInfo.getRegionName(), "row7".getBytes());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      regionsOfTable = cluster.getMaster()<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          .getAssignmentManager().getRegionStates()<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .getRegionsOfTable(userTableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      while (regionsOfTable.size() != 2) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        Thread.sleep(1000);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        regionsOfTable = cluster.getMaster()<a name="line.481"></a>
-<span class="sourceLineNo">482</span>            .getAssignmentManager().getRegionStates()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>            .getRegionsOfTable(userTableName);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.debug("waiting 2 regions to be available, got " + regionsOfTable.size() +<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          ": " + regionsOfTable);<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>      }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      Assert.assertEquals(2, regionsOfTable.size());<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      Scan s = new Scan();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      ResultScanner scanner = table.getScanner(s);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      int mainTableCount = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        mainTableCount++;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      Assert.assertEquals(3, mainTableCount);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    } finally {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      table.close();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * Verifies HBASE-5806.  Here the case is that splitting is completed but before the<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * CJ could remove the parent region the master is killed and restarted.<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @throws IOException<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   * @throws InterruptedException<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @throws NodeExistsException<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @throws KeeperException<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  @Test<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  public void testMasterRestartAtRegionSplitPendingCatalogJanitor()<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      throws IOException, InterruptedException, NodeExistsException,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      KeeperException, ServiceException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    // Create table then get the single region for our new table.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    this.admin.setBalancerRunning(false, true);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Add a bit of load up into the table so splittable.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      // Get region pre-split.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      printOutRegions(server, "Initial regions: ");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Call split.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      this.admin.splitRegion(hri.getRegionName());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // Before cleanup, get a new master.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      HMaster master = abortAndWaitForMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      // Now call compact on the daughters and clean up any references.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      for (HRegion daughter: daughters) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        daughter.compact(true);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        assertFalse(daughter.hasReferences());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      // BUT calling compact on the daughters is not enough. The CatalogJanitor looks<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      // in the filesystem, and the filesystem content is not same as what the Region<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      // is reading from. Compacted-away files are picked up later by the compacted<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      // file discharger process. It runs infrequently. Make it run so CatalogJanitor<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      // doens't find any references.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      for (RegionServerThread rst: cluster.getRegionServerThreads()) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>        boolean oldSetting = rst.getRegionServer().compactedFileDischarger.setUseExecutor(false);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        rst.getRegionServer().compactedFileDischarger.run();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        rst.getRegionServer().compactedFileDischarger.setUseExecutor(oldSetting);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      LOG.info("Starting run of CatalogJanitor");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      cluster.getMaster().getCatalogJanitor().run();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      ProcedureTestingUtility.waitAllProcedures(cluster.getMaster().getMasterProcedureExecutor());<a name="line.556"></a>
-<span 

<TRUNCATED>

[05/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
index a369370..295a1d4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.MyMaster.html
@@ -39,989 +39,1006 @@
 <span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.Optional;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.ServerName;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Get;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Put;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Table;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.zookeeper.KeeperException;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.After;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.junit.AfterClass;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.junit.Assert;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.junit.Before;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.junit.BeforeClass;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.junit.ClassRule;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.junit.Rule;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.junit.Test;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.junit.experimental.categories.Category;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.junit.rules.TestName;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.slf4j.Logger;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.slf4j.LoggerFactory;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * The below tests are testing split region against a running cluster<a name="line.113"></a>
-<span class="sourceLineNo">114</span> */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.115"></a>
-<span class="sourceLineNo">116</span>@SuppressWarnings("deprecation")<a name="line.116"></a>
-<span class="sourceLineNo">117</span>public class TestSplitTransactionOnCluster {<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @ClassRule<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private Admin admin = null;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private MiniHBaseCluster cluster = null;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static final int NB_SERVERS = 3;<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    new HBaseTestingUtility();<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  @Rule<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  public TestName name = new TestName();<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @BeforeClass public static void before() throws Exception {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  @AfterClass public static void after() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TESTING_UTIL.shutdownMiniCluster();<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>  @Before public void setup() throws IOException {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  @After<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  public void tearDown() throws Exception {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    this.admin.close();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      TESTING_UTIL.deleteTable(htd.getTableName());<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>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throws IOException, InterruptedException {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(1, regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    try {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchProcedureException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return hri;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private void requestSplitRegion(<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      final HRegionServer rsServer,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      final Region region,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      final byte[] midKey) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testRITStateForRollback() throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    final HMaster master = cluster.getMaster();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      // Create table then get the single region for our new table.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      insertData(tableName, admin, t);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      t.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      this.admin.setBalancerRunning(false, true);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      master.setCatalogJanitorEnabled(false);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // find a splittable region<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      final HRegion region = findSplittableRegion(regions);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // install master co-processor to fail splits<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      master.getMasterCoprocessorHost().load(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        FailingSplitMasterObserver.class,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        Coprocessor.PRIORITY_USER,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        master.getConfiguration());<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // split async<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      FailingSplitMasterObserver observer =<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      assertNotNull(observer);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      observer.latch.await();<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        Threads.sleep(100);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      admin.setBalancerRunning(true, false);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      master.setCatalogJanitorEnabled(true);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      abortAndWaitForMaster();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      TESTING_UTIL.deleteTable(tableName);<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  @Test<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // Create table then get the single region for our new table.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    admin.createTable(htd);<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Thread.sleep(100);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    HStore store = region.getStore(cf);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // insert data<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    insertData(tableName, admin, t);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    insertData(tableName, admin, t);<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int fileNum = store.getStorefiles().size();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // 0, Compaction Request<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    store.triggerMajorCompaction();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertTrue(cc.isPresent());<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // 1, A timeout split<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    // 1.1 close region<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // 1.2 rollback and Region initialize again<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    region.initialize();<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // 2, Run Compaction cc<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // 3, Split<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    volatile CountDownLatch latch;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      latch = new CountDownLatch(1);<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>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return Optional.of(this);<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>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void preSplitRegionBeforeMETAAction(<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        final byte[] splitKey,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      latch.countDown();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      throw new IOException("Causing rollback of region split");<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><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  @Test<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    // Create table then get the single region for our new table.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.305"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.conf.Configuration;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.FileSystem;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.fs.Path;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.ServerName;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Get;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Put;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Result;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Table;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.zookeeper.KeeperException;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.junit.After;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.junit.AfterClass;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.junit.Assert;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.junit.Before;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.junit.BeforeClass;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.junit.ClassRule;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.junit.Rule;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.junit.Test;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.junit.experimental.categories.Category;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.junit.rules.TestName;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.slf4j.Logger;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.slf4j.LoggerFactory;<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> * The below tests are testing split region against a running cluster<a name="line.115"></a>
+<span class="sourceLineNo">116</span> */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.117"></a>
+<span class="sourceLineNo">118</span>@SuppressWarnings("deprecation")<a name="line.118"></a>
+<span class="sourceLineNo">119</span>public class TestSplitTransactionOnCluster {<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  @ClassRule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private Admin admin = null;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private MiniHBaseCluster cluster = null;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static final int NB_SERVERS = 3;<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    new HBaseTestingUtility();<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Rule<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public TestName name = new TestName();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @BeforeClass public static void before() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @AfterClass public static void after() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    TESTING_UTIL.shutdownMiniCluster();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Before public void setup() throws IOException {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @After<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public void tearDown() throws Exception {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    this.admin.close();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      TESTING_UTIL.deleteTable(htd.getTableName());<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      throws IOException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertEquals(1, regions.size());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    try {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    } catch (NoSuchProcedureException e) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return hri;<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>  private void requestSplitRegion(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      final HRegionServer rsServer,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      final Region region,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      final byte[] midKey) throws IOException {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<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>  @Test<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  public void testRITStateForRollback() throws Exception {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    final HMaster master = cluster.getMaster();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      // Create table then get the single region for our new table.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      insertData(tableName, admin, t);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      t.close();<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      this.admin.setBalancerRunning(false, true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      master.setCatalogJanitorEnabled(false);<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // find a splittable region<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      final HRegion region = findSplittableRegion(regions);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>      // install master co-processor to fail splits<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      master.getMasterCoprocessorHost().load(<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        FailingSplitMasterObserver.class,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        Coprocessor.PRIORITY_USER,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        master.getConfiguration());<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // split async<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FailingSplitMasterObserver observer =<a name="line.213"></a>
+<span class="sourceLineNo">214</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      assertNotNull(observer);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      observer.latch.await();<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        Threads.sleep(100);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } finally {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      admin.setBalancerRunning(true, false);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      master.setCatalogJanitorEnabled(true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      abortAndWaitForMaster();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      TESTING_UTIL.deleteTable(tableName);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  @Test<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // Create table then get the single region for our new table.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    admin.createTable(htd);<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      Thread.sleep(100);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    HStore store = region.getStore(cf);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // insert data<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    insertData(tableName, admin, t);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    insertData(tableName, admin, t);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    int fileNum = store.getStorefiles().size();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // 0, Compaction Request<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    store.triggerMajorCompaction();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    assertTrue(cc.isPresent());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // 1, A timeout split<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // 1.1 close region<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // 1.2 rollback and Region initialize again<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    region.initialize();<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // 2, Run Compaction cc<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // 3, Split<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    volatile CountDownLatch latch;<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    @Override<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      latch = new CountDownLatch(1);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return Optional.of(this);<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>    @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    public void preSplitRegionBeforeMETAAction(<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        final byte[] splitKey,<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      latch.countDown();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      throw new IOException("Causing rollback of region split");<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // Create table then get the single region for our new table.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.305"></a>
 <span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.307"></a>
+<span class="sourceLineNo">307</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.307"></a>
 <span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.admin.setBalancerRunning(false, true);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // Add a bit of load up into the table so splittable.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Get region pre-split.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      printOutRegions(server, "Initial regions: ");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // rollback.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // split transaction. Catch the exception instead.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      try {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        fail();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      } catch (DoNotRetryRegionException e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        // Expected<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Wait around a while and assert count of regions remains constant.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        Thread.sleep(100);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // Now try splitting and it should work.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      split(hri, server, regionCount);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      // Get daughters<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      checkAndGetDaughters(tableName);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      // OK, so split happened after we cleared the blocking node.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    } finally {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      admin.setBalancerRunning(true, false);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      t.close();<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><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @throws IOException<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @throws InterruptedException<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  @Test<a name="line.356"></a>
-<span class="sourceLineNo">357</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Create table then get the single region for our new table.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.365"></a>
+<span class="sourceLineNo">309</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    this.admin.setBalancerRunning(false, true);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Add a bit of load up into the table so splittable.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // Get region pre-split.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      printOutRegions(server, "Initial regions: ");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // rollback.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      // split transaction. Catch the exception instead.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        fail();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      } catch (DoNotRetryRegionException e) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        // Expected<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // Wait around a while and assert count of regions remains constant.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        Thread.sleep(100);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      // Now try splitting and it should work.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      split(hri, server, regionCount);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      // Get daughters<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      checkAndGetDaughters(tableName);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      // OK, so split happened after we cleared the blocking node.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } finally {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      admin.setBalancerRunning(true, false);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      t.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<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>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @throws IOException<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @throws InterruptedException<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  @Test<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // Create table then get the single region for our new table.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.365"></a>
 <span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    this.admin.setBalancerRunning(false, true);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    try {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      // Add a bit of load up into the table so splittable.<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Get region pre-split.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      printOutRegions(server, "Initial regions: ");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      // Now split.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      split(hri, server, regionCount);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      // Get daughters<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // Now split one of the daughters.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      RegionInfo daughter = daughters.get(0).getRegionInfo();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.info("Daughter we are going to split: " + daughter);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Compact first to ensure we have cleaned up references -- else the split<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // will fail.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      this.admin.compactRegion(daughter.getRegionName());<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      daughters = cluster.getRegions(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      HRegion daughterRegion = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      for (HRegion r: daughters) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        if (RegionInfo.COMPARATOR.compare(r.getRegionInfo(), daughter) == 0) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          daughterRegion = r;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          LOG.info("Found matching HRI: " + daughterRegion);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          break;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      assertTrue(daughterRegion != null);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      for (int i=0; i&lt;100; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        if (!daughterRegion.hasReferences()) break;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Threads.sleep(100);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      assertFalse("Waiting for reference to be compacted", daughterRegion.hasReferences());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      LOG.info("Daughter hri before split (has been compacted): " + daughter);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      split(daughter, server, regionCount);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // Get list of daughters<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      daughters = cluster.getRegions(tableName);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      for (HRegion d: daughters) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        LOG.info("Regions before crash: " + d);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Now crash the server<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      cluster.abortRegionServer(tableRegionIndex);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      waitUntilRegionServerDead();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      awaitDaughters(tableName, daughters.size());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      // Assert daughters are online and ONLY the original daughters -- that<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      // fixup didn't insert one during server shutdown recover.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      regions = cluster.getRegions(tableName);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      for (HRegion d: daughters) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        LOG.info("Regions after crash: " + d);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (daughters.size() != regions.size()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        LOG.info("Daughters=" + daughters.size() + ", regions=" + regions.size());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      assertEquals(daughters.size(), regions.size());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      for (HRegion r: regions) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        LOG.info("Regions post crash " + r + ", contains=" + daughters.contains(r));<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        assertTrue("Missing region post crash " + r, daughters.contains(r));<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      LOG.info("EXITING");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      admin.setBalancerRunning(true, false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      t.close();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @Test<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles() throws Exception {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    TableName userTableName = TableName.valueOf(name.getMethodName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    HTableDescriptor htd = new HTableDescriptor(userTableName);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    HColumnDescriptor hcd = new HColumnDescriptor("col");<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    htd.addFamily(hcd);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    admin.createTable(htd);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    Table table = TESTING_UTIL.getConnection().getTable(userTableName);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      for (int i = 0; i &lt;= 5; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        String row = "row" + i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Put p = new Put(row.getBytes());<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        String val = "Val" + i;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        p.addColumn("col".getBytes(), "ql".getBytes(), val.getBytes());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        table.put(p);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        admin.flush(userTableName);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        Delete d = new Delete(row.getBytes());<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        // Do a normal delete<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        table.delete(d);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        admin.flush(userTableName);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      admin.majorCompact(userTableName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      List&lt;RegionInfo&gt; regionsOfTable =<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          cluster.getMaster().getAssignmentManager().getRegionStates()<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          .getRegionsOfTable(userTableName);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(1, regionsOfTable.size());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      RegionInfo hRegionInfo = regionsOfTable.get(0);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      Put p = new Put("row6".getBytes());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      table.put(p);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      p = new Put("row7".getBytes());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      table.put(p);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      p = new Put("row8".getBytes());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      table.put(p);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      admin.flush(userTableName);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      admin.splitRegion(hRegionInfo.getRegionName(), "row7".getBytes());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      regionsOfTable = cluster.getMaster()<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          .getAssignmentManager().getRegionStates()<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .getRegionsOfTable(userTableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      while (regionsOfTable.size() != 2) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        Thread.sleep(1000);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        regionsOfTable = cluster.getMaster()<a name="line.481"></a>
-<span class="sourceLineNo">482</span>            .getAssignmentManager().getRegionStates()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>            .getRegionsOfTable(userTableName);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.debug("waiting 2 regions to be available, got " + regionsOfTable.size() +<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          ": " + regionsOfTable);<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>      }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      Assert.assertEquals(2, regionsOfTable.size());<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      Scan s = new Scan();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      ResultScanner scanner = table.getScanner(s);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      int mainTableCount = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        mainTableCount++;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      Assert.assertEquals(3, mainTableCount);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    } finally {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      table.close();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * Verifies HBASE-5806.  Here the case is that splitting is completed but before the<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * CJ could remove the parent region the master is killed and restarted.<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @throws IOException<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   * @throws InterruptedException<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @throws NodeExistsException<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @throws KeeperException<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  @Test<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  public void testMasterRestartAtRegionSplitPendingCatalogJanitor()<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      throws IOException, InterruptedException, NodeExistsException,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      KeeperException, ServiceException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    // Create table then get the single region for our new table.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    this.admin.setBalancerRunning(false, true);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Add a bit of load up into the table so splittable.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      // Get region pre-split.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      printOutRegions(server, "Initial regions: ");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Call split.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      this.admin.splitRegion(hri.getRegionName());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // Before cleanup, get a new master.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      HMaster master = abortAndWaitForMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      // Now call compact on the daughters and clean up any references.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      for (HRegion daughter: daughters) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        daughter.compact(true);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        assertFalse(daughter.hasReferences());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      // BUT calling compact on the daughters is not enough. The CatalogJanitor looks<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      // in the filesystem, and the filesystem content is not same as what the Region<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      // is reading from. Compacted-away files are picked up later by the compacted<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      // file discharger process. It runs infrequently. Make it run so CatalogJanitor<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      // doens't find any references.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      for (RegionServerThread rst: cluster.getRegionServerThreads()) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>        boolean oldSetting = rst.getRegionServer().compactedFileDischarger.setUseExecutor(false);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        rst.getRegionServer().compactedFileDischarger.run();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        rst.getRegionServer().compactedFileDischarger.setUseExecutor(oldSetting);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      LOG.info("Starting run of CatalogJanitor");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      cluster.getMaster().getCatalogJanitor().run();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      ProcedureTestingUtility.waitAllProcedures(cluster.getMaster().getMasterProcedureExecutor());<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      RegionStates regio

<TRUNCATED>

[02/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
index fc71310..e6f60c1 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
@@ -70,664 +70,687 @@
 <span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.62"></a>
 <span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.63"></a>
 <span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hdfs.DistributedFileSystem;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hdfs.MiniDFSCluster;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hdfs.protocol.HdfsConstants;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.junit.After;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.junit.AfterClass;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.junit.Before;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.BeforeClass;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.ClassRule;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.Rule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Test;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.experimental.categories.Category;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.rules.TestName;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.slf4j.Logger;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.LoggerFactory;<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>/**<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * WAL tests that can be reused across providers.<a name="line.81"></a>
-<span class="sourceLineNo">082</span> */<a name="line.82"></a>
-<span class="sourceLineNo">083</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.83"></a>
-<span class="sourceLineNo">084</span>public class TestWALFactory {<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @ClassRule<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      HBaseClassTestRule.forClass(TestWALFactory.class);<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private static final Logger LOG = LoggerFactory.getLogger(TestWALFactory.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  protected static Configuration conf;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static MiniDFSCluster cluster;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  protected static Path hbaseDir;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  protected static Path hbaseWALDir;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  protected FileSystem fs;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  protected Path dir;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  protected WALFactory wals;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  private ServerName currentServername;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  @Rule<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public final TestName currentTest = new TestName();<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  @Before<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public void setUp() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    fs = cluster.getFileSystem();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    dir = new Path(hbaseDir, currentTest.getMethodName());<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    this.currentServername = ServerName.valueOf(currentTest.getMethodName(), 16010, 1);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    wals = new WALFactory(conf, this.currentServername.toString());<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>  @After<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public void tearDown() throws Exception {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    // testAppendClose closes the FileSystem, which will prevent us from closing cleanly here.<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    try {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      wals.close();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    } catch (IOException exception) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.warn("Encountered exception while closing wal factory. If you have other errors, this" +<a name="line.120"></a>
-<span class="sourceLineNo">121</span>          " may be the cause. Message: " + exception);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      LOG.debug("Exception details for failure to close wal factory.", exception);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    FileStatus[] entries = fs.listStatus(new Path("/"));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    for (FileStatus dir : entries) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      fs.delete(dir.getPath(), true);<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><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  @BeforeClass<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  public static void setUpBeforeClass() throws Exception {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    CommonFSUtils.setWALRootDir(TEST_UTIL.getConfiguration(), new Path("file:///tmp/wal"));<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    // Make block sizes small.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    TEST_UTIL.getConfiguration().setInt("dfs.blocksize", 1024 * 1024);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    // needed for testAppendClose()<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    // quicker heartbeat interval for faster DN death notification<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    TEST_UTIL.getConfiguration().setInt("dfs.namenode.heartbeat.recheck-interval", 5000);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    TEST_UTIL.getConfiguration().setInt("dfs.heartbeat.interval", 1);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    TEST_UTIL.getConfiguration().setInt("dfs.client.socket-timeout", 5000);<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    // faster failover with cluster.shutdown();fs.close() idiom<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    TEST_UTIL.getConfiguration()<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        .setInt("hbase.ipc.client.connect.max.retries", 1);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        "dfs.client.block.recovery.retries", 1);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      "hbase.ipc.client.connection.maxidletime", 500);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.timeout", 10000);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.dfs.timeout", 1000);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    TEST_UTIL.getConfiguration().set(CoprocessorHost.WAL_COPROCESSOR_CONF_KEY,<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        SampleRegionWALCoprocessor.class.getName());<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    TEST_UTIL.startMiniDFSCluster(3);<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    conf = TEST_UTIL.getConfiguration();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    cluster = TEST_UTIL.getDFSCluster();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    hbaseDir = TEST_UTIL.createRootDir();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    hbaseWALDir = TEST_UTIL.createWALRootDir();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  @AfterClass<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  public static void tearDownAfterClass() throws Exception {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Test<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  public void canCloseSingleton() throws IOException {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    WALFactory.getInstance(conf).close();<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>  /**<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * Just write multiple logs then split.  Before fix for HADOOP-2283, this<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * would fail.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @throws IOException<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  @Test<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  public void testSplit() throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    final TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    final byte [] rowName = tableName.getName();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    final int howmany = 3;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    RegionInfo[] infos = new RegionInfo[3];<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    Path tabledir = FSUtils.getTableDir(hbaseDir, tableName);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    fs.mkdirs(tabledir);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    for (int i = 0; i &lt; howmany; i++) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      infos[i] = RegionInfoBuilder.newBuilder(tableName).setStartKey(Bytes.toBytes("" + i))<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          .setEndKey(Bytes.toBytes("" + (i + 1))).build();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      fs.mkdirs(new Path(tabledir, infos[i].getEncodedName()));<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info("allo " + new Path(tabledir, infos[i].getEncodedName()).toString());<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    scopes.put(Bytes.toBytes("column"), 0);<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALFactory.Providers;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hdfs.DistributedFileSystem;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hdfs.MiniDFSCluster;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hdfs.protocol.HdfsConstants;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.After;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.AfterClass;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.junit.Before;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.BeforeClass;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>/**<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * WAL tests that can be reused across providers.<a name="line.82"></a>
+<span class="sourceLineNo">083</span> */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.84"></a>
+<span class="sourceLineNo">085</span>public class TestWALFactory {<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @ClassRule<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      HBaseClassTestRule.forClass(TestWALFactory.class);<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private static final Logger LOG = LoggerFactory.getLogger(TestWALFactory.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  protected static Configuration conf;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static MiniDFSCluster cluster;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  protected static Path hbaseDir;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  protected static Path hbaseWALDir;<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  protected FileSystem fs;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  protected Path dir;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  protected WALFactory wals;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  private ServerName currentServername;<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @Rule<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public final TestName currentTest = new TestName();<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @Before<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public void setUp() throws Exception {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    fs = cluster.getFileSystem();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    dir = new Path(hbaseDir, currentTest.getMethodName());<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    this.currentServername = ServerName.valueOf(currentTest.getMethodName(), 16010, 1);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    wals = new WALFactory(conf, this.currentServername.toString());<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>  @After<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public void tearDown() throws Exception {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // testAppendClose closes the FileSystem, which will prevent us from closing cleanly here.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    try {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      wals.close();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    } catch (IOException exception) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      LOG.warn("Encountered exception while closing wal factory. If you have other errors, this" +<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          " may be the cause. Message: " + exception);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      LOG.debug("Exception details for failure to close wal factory.", exception);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    FileStatus[] entries = fs.listStatus(new Path("/"));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    for (FileStatus dir : entries) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      fs.delete(dir.getPath(), true);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @BeforeClass<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public static void setUpBeforeClass() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    CommonFSUtils.setWALRootDir(TEST_UTIL.getConfiguration(), new Path("file:///tmp/wal"));<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Make block sizes small.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    TEST_UTIL.getConfiguration().setInt("dfs.blocksize", 1024 * 1024);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // needed for testAppendClose()<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    // quicker heartbeat interval for faster DN death notification<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    TEST_UTIL.getConfiguration().setInt("dfs.namenode.heartbeat.recheck-interval", 5000);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    TEST_UTIL.getConfiguration().setInt("dfs.heartbeat.interval", 1);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    TEST_UTIL.getConfiguration().setInt("dfs.client.socket-timeout", 5000);<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>    // faster failover with cluster.shutdown();fs.close() idiom<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    TEST_UTIL.getConfiguration()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        .setInt("hbase.ipc.client.connect.max.retries", 1);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        "dfs.client.block.recovery.retries", 1);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      "hbase.ipc.client.connection.maxidletime", 500);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.timeout", 10000);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    TEST_UTIL.getConfiguration().setInt("hbase.lease.recovery.dfs.timeout", 1000);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    TEST_UTIL.getConfiguration().set(CoprocessorHost.WAL_COPROCESSOR_CONF_KEY,<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        SampleRegionWALCoprocessor.class.getName());<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    TEST_UTIL.startMiniDFSCluster(3);<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>    conf = TEST_UTIL.getConfiguration();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    cluster = TEST_UTIL.getDFSCluster();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    hbaseDir = TEST_UTIL.createRootDir();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    hbaseWALDir = TEST_UTIL.createWALRootDir();<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>  @AfterClass<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  public static void tearDownAfterClass() throws Exception {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    TEST_UTIL.shutdownMiniCluster();<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>  @Test<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public void canCloseSingleton() throws IOException {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    WALFactory.getInstance(conf).close();<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>   * Just write multiple logs then split.  Before fix for HADOOP-2283, this<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * would fail.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * @throws IOException<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  @Test<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public void testSplit() throws IOException {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    final TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    final byte [] rowName = tableName.getName();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final int howmany = 3;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    RegionInfo[] infos = new RegionInfo[3];<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    Path tabledir = FSUtils.getTableDir(hbaseDir, tableName);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    fs.mkdirs(tabledir);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    for (int i = 0; i &lt; howmany; i++) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      infos[i] = RegionInfoBuilder.newBuilder(tableName).setStartKey(Bytes.toBytes("" + i))<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          .setEndKey(Bytes.toBytes("" + (i + 1))).build();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      fs.mkdirs(new Path(tabledir, infos[i].getEncodedName()));<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      LOG.info("allo " + new Path(tabledir, infos[i].getEncodedName()).toString());<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    scopes.put(Bytes.toBytes("column"), 0);<a name="line.193"></a>
 <span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // Add edits for three regions.<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    for (int ii = 0; ii &lt; howmany; ii++) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      for (int i = 0; i &lt; howmany; i++) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        final WAL log =<a name="line.198"></a>
-<span class="sourceLineNo">199</span>            wals.getWAL(infos[i]);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        for (int j = 0; j &lt; howmany; j++) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          WALEdit edit = new WALEdit();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>          byte [] family = Bytes.toBytes("column");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          byte [] qualifier = Bytes.toBytes(Integer.toString(j));<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          byte [] column = Bytes.toBytes("column:" + Integer.toString(j));<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          edit.add(new KeyValue(rowName, family, qualifier,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>              System.currentTimeMillis(), column));<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          LOG.info("Region " + i + ": " + edit);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          WALKeyImpl walKey =  new WALKeyImpl(infos[i].getEncodedNameAsBytes(), tableName,<a name="line.208"></a>
-<span class="sourceLineNo">209</span>              System.currentTimeMillis(), mvcc, scopes);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          log.append(infos[i], walKey, edit, true);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          walKey.getWriteEntry();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        log.sync();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        log.rollWriter(true);<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>    wals.shutdown();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // The below calculation of logDir relies on insider information... WALSplitter should be connected better<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // with the WAL system.... not requiring explicit path. The oldLogDir is just made up not used.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    Path logDir =<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        new Path(new Path(hbaseWALDir, HConstants.HREGION_LOGDIR_NAME),<a name="line.221"></a>
-<span class="sourceLineNo">222</span>            this.currentServername.toString());<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    Path oldLogDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    List&lt;Path&gt; splits = WALSplitter.split(hbaseWALDir, logDir, oldLogDir, fs, conf, wals);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    verifySplits(splits, howmany);<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>  /**<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * Test new HDFS-265 sync.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @throws Exception<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void Broken_testSync() throws Exception {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    // First verify that using streams all works.<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    Path p = new Path(dir, currentTest.getMethodName() + ".fsdos");<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    FSDataOutputStream out = fs.create(p);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    out.write(tableName.getName());<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    Method syncMethod = null;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    try {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      syncMethod = out.getClass().getMethod("hflush", new Class&lt;?&gt; []{});<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    } catch (NoSuchMethodException e) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      try {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        syncMethod = out.getClass().getMethod("sync", new Class&lt;?&gt; []{});<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      } catch (NoSuchMethodException ex) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        fail("This version of Hadoop supports neither Syncable.sync() " +<a name="line.247"></a>
-<span class="sourceLineNo">248</span>            "nor Syncable.hflush().");<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    syncMethod.invoke(out, new Object[]{});<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    FSDataInputStream in = fs.open(p);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    assertTrue(in.available() &gt; 0);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    byte [] buffer = new byte [1024];<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    int read = in.read(buffer);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    assertEquals(tableName.getName().length, read);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    out.close();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    in.close();<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final int total = 20;<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    WAL.Reader reader = null;<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>    try {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      RegionInfo info = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      scopes.put(tableName.getName(), 0);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      final WAL wal = wals.getWAL(info);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (int i = 0; i &lt; total; i++) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        WALEdit kvs = new WALEdit();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      // Now call sync and try reading.  Opening a Reader before you sync just<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      // gives you EOFE.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      wal.sync();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // Open a Reader.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      reader = wals.createReader(fs, walPath);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      int count = 0;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      WAL.Entry entry = new WAL.Entry();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      while ((entry = reader.next(entry)) != null) count++;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      assertEquals(total, count);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      reader.close();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      // Add test that checks to see that an open of a Reader works on a file<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // that has had a sync done on it.<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      for (int i = 0; i &lt; total; i++) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        WALEdit kvs = new WALEdit();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      wal.sync();<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      reader = wals.createReader(fs, walPath);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      count = 0;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      assertTrue(count &gt;= total);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      reader.close();<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      // If I sync, should see double the edits.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      wal.sync();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      reader = wals.createReader(fs, walPath);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      count = 0;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      assertEquals(total * 2, count);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      reader.close();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      // Now do a test that ensures stuff works when we go over block boundary,<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      // especially that we return good length on file.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      final byte [] value = new byte[1025 * 1024];  // Make a 1M value.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      for (int i = 0; i &lt; total; i++) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        WALEdit kvs = new WALEdit();<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), value));<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            System.currentTimeMillis(), mvcc, scopes), kvs,  true);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Now I should have written out lots of blocks.  Sync then read.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      wal.sync();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      reader = wals.createReader(fs, walPath);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      count = 0;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      assertEquals(total * 3, count);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      reader.close();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // shutdown and ensure that Reader gets right length also.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      wal.shutdown();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      reader = wals.createReader(fs, walPath);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      count = 0;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      assertEquals(total * 3, count);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      reader.close();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    } finally {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (reader != null) reader.close();<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><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  private void verifySplits(final List&lt;Path&gt; splits, final int howmany)<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    assertEquals(howmany * howmany, splits.size());<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    for (int i = 0; i &lt; splits.size(); i++) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      LOG.info("Verifying=" + splits.get(i));<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      WAL.Reader reader = wals.createReader(fs, splits.get(i));<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      try {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        int count = 0;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        String previousRegion = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        long seqno = -1;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        WAL.Entry entry = new WAL.Entry();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        while((entry = reader.next(entry)) != null) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          WALKey key = entry.getKey();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          String region = Bytes.toString(key.getEncodedRegionName());<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          // Assert that all edits are for same region.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          if (previousRegion != null) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>            assertEquals(previousRegion, region);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          LOG.info("oldseqno=" + seqno + ", newseqno=" + key.getSequenceId());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          assertTrue(seqno &lt; key.getSequenceId());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          seqno = key.getSequenceId();<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          previousRegion = region;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          count++;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        assertEquals(howmany, count);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      } finally {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        reader.close();<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>  /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * We pass different values to recoverFileLease() so that different code paths are covered<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   *<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * For this test to pass, requires:<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * 1. HDFS-200 (append support)<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * 2. HDFS-988 (SafeMode should freeze file operations<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   *              [FSNamesystem.nextGenerationStampForBlock])<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * 3. HDFS-142 (on restart, maintain pendingCreates)<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  @Test<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void testAppendClose() throws Exception {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    TableName tableName =<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        TableName.valueOf(currentTest.getMethodName());<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    RegionInfo regionInfo = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>    WAL wal = wals.getWAL(regionInfo);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    int total = 20;<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    scopes.put(tableName.getName(), 0);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    for (int i = 0; i &lt; total; i++) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      WALEdit kvs = new WALEdit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      wal.append(regionInfo, new WALKeyImpl(regionInfo.getEncodedNameAsBytes(), tableName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          System.currentTimeMillis(), mvcc, scopes),<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        kvs, true);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    // Now call sync to send the data to HDFS datanodes<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    wal.sync();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>     int namenodePort = cluster.getNameNodePort();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    final Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // Add edits for three regions.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    for (int ii = 0; ii &lt; howmany; ii++) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      for (int i = 0; i &lt; howmany; i++) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        final WAL log =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>            wals.getWAL(infos[i]);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        for (int j = 0; j &lt; howmany; j++) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          WALEdit edit = new WALEdit();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          byte [] family = Bytes.toBytes("column");<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          byte [] qualifier = Bytes.toBytes(Integer.toString(j));<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          byte [] column = Bytes.toBytes("column:" + Integer.toString(j));<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          edit.add(new KeyValue(rowName, family, qualifier,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>              System.currentTimeMillis(), column));<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          LOG.info("Region " + i + ": " + edit);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          WALKeyImpl walKey =  new WALKeyImpl(infos[i].getEncodedNameAsBytes(), tableName,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>              System.currentTimeMillis(), mvcc, scopes);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          log.append(infos[i], walKey, edit, true);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          walKey.getWriteEntry();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        log.sync();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        log.rollWriter(true);<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>    wals.shutdown();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    // The below calculation of logDir relies on insider information... WALSplitter should be connected better<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // with the WAL system.... not requiring explicit path. The oldLogDir is just made up not used.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    Path logDir =<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        new Path(new Path(hbaseWALDir, HConstants.HREGION_LOGDIR_NAME),<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            this.currentServername.toString());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    Path oldLogDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    List&lt;Path&gt; splits = WALSplitter.split(hbaseWALDir, logDir, oldLogDir, fs, conf, wals);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    verifySplits(splits, howmany);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test new HDFS-265 sync.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @throws Exception<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  @Test<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public void Broken_testSync() throws Exception {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    TableName tableName = TableName.valueOf(currentTest.getMethodName());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // First verify that using streams all works.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    Path p = new Path(dir, currentTest.getMethodName() + ".fsdos");<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    FSDataOutputStream out = fs.create(p);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    out.write(tableName.getName());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    Method syncMethod = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    try {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      syncMethod = out.getClass().getMethod("hflush", new Class&lt;?&gt; []{});<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } catch (NoSuchMethodException e) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      try {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        syncMethod = out.getClass().getMethod("sync", new Class&lt;?&gt; []{});<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      } catch (NoSuchMethodException ex) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        fail("This version of Hadoop supports neither Syncable.sync() " +<a name="line.248"></a>
+<span class="sourceLineNo">249</span>            "nor Syncable.hflush().");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    syncMethod.invoke(out, new Object[]{});<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    FSDataInputStream in = fs.open(p);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    assertTrue(in.available() &gt; 0);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    byte [] buffer = new byte [1024];<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    int read = in.read(buffer);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    assertEquals(tableName.getName().length, read);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    out.close();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    in.close();<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    final int total = 20;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    WAL.Reader reader = null;<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      RegionInfo info = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      scopes.put(tableName.getName(), 0);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      final WAL wal = wals.getWAL(info);<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>      for (int i = 0; i &lt; total; i++) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        WALEdit kvs = new WALEdit();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      // Now call sync and try reading.  Opening a Reader before you sync just<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      // gives you EOFE.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      wal.sync();<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // Open a Reader.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      reader = wals.createReader(fs, walPath);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      int count = 0;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      WAL.Entry entry = new WAL.Entry();<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      while ((entry = reader.next(entry)) != null) count++;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      assertEquals(total, count);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      reader.close();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // Add test that checks to see that an open of a Reader works on a file<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      // that has had a sync done on it.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      for (int i = 0; i &lt; total; i++) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        WALEdit kvs = new WALEdit();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            System.currentTimeMillis(), mvcc, scopes), kvs, true);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      wal.sync();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      reader = wals.createReader(fs, walPath);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      count = 0;<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      assertTrue(count &gt;= total);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      reader.close();<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      // If I sync, should see double the edits.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      wal.sync();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      reader = wals.createReader(fs, walPath);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      count = 0;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      assertEquals(total * 2, count);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      reader.close();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      // Now do a test that ensures stuff works when we go over block boundary,<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      // especially that we return good length on file.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      final byte [] value = new byte[1025 * 1024];  // Make a 1M value.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      for (int i = 0; i &lt; total; i++) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        WALEdit kvs = new WALEdit();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), value));<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        wal.append(info, new WALKeyImpl(info.getEncodedNameAsBytes(), tableName,<a name="line.314"></a>
+<span class="sourceLineNo">315</span>            System.currentTimeMillis(), mvcc, scopes), kvs,  true);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // Now I should have written out lots of blocks.  Sync then read.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      wal.sync();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      reader = wals.createReader(fs, walPath);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      count = 0;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      assertEquals(total * 3, count);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      reader.close();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // shutdown and ensure that Reader gets right length also.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      wal.shutdown();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      reader = wals.createReader(fs, walPath);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      count = 0;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      while((entry = reader.next(entry)) != null) count++;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      assertEquals(total * 3, count);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      reader.close();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    } finally {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      if (reader != null) reader.close();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<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>  private void verifySplits(final List&lt;Path&gt; splits, final int howmany)<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    assertEquals(howmany * howmany, splits.size());<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    for (int i = 0; i &lt; splits.size(); i++) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      LOG.info("Verifying=" + splits.get(i));<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      WAL.Reader reader = wals.createReader(fs, splits.get(i));<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        int count = 0;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        String previousRegion = null;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        long seqno = -1;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        WAL.Entry entry = new WAL.Entry();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        while((entry = reader.next(entry)) != null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          WALKey key = entry.getKey();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          String region = Bytes.toString(key.getEncodedRegionName());<a name="line.349"></a>
+<span class="sourceLineNo">350</span>          // Assert that all edits are for same region.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          if (previousRegion != null) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>            assertEquals(previousRegion, region);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>          }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>          LOG.info("oldseqno=" + seqno + ", newseqno=" + key.getSequenceId());<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          assertTrue(seqno &lt; key.getSequenceId());<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          seqno = key.getSequenceId();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          previousRegion = region;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          count++;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        assertEquals(howmany, count);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      } finally {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        reader.close();<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><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /*<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * We pass different values to recoverFileLease() so that different code paths are covered<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   *<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * For this test to pass, requires:<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * 1. HDFS-200 (append support)<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * 2. HDFS-988 (SafeMode should freeze file operations<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   *              [FSNamesystem.nextGenerationStampForBlock])<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * 3. HDFS-142 (on restart, maintain pendingCreates)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void testAppendClose() throws Exception {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    TableName tableName =<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        TableName.valueOf(currentTest.getMethodName());<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    RegionInfo regionInfo = RegionInfoBuilder.newBuilder(tableName).build();<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    WAL wal = wals.getWAL(regionInfo);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    int total = 20;<a name="line.383"></a>
+<span class="sourceLineNo">384</span><a name="line.384"></a>
+<span class="sourceLineNo">385</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    scopes.put(tableName.getName(), 0);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    for (int i = 0; i &lt; total; i++) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      WALEdit kvs = new WALEdit();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      kvs.add(new KeyValue(Bytes.toBytes(i), tableName.getName(), tableName.getName()));<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      wal.append(regionInfo, new WALKeyImpl(regionInfo.getEncodedNameAsBytes(), tableName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          System.currentTimeMillis(), mvcc, scopes),<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        kvs, true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    // Now call sync to send the data to HDFS datanodes<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    wal.sync();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>     int namenodePort = cluster.getNameNodePort();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    final Path walPath = AbstractFSWALProvider.getCurrentFileName(wal);<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Stop the cluster.  (ensure restart since we're sharing MiniDFSCluster)<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    try {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      DistributedFileSystem dfs = cluster.getFileSystem();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      dfs.setSafeMode(HdfsConstants.SafeModeAction.SAFEMODE_ENTER);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      TEST_UTIL.shutdownMiniDFSCluster();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      try {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        // wal.writer.close() will throw an exception,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        // but still call this since it closes the LogSyncer thread first<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        wal.shutdown();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      } catch (IOException e) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        LOG.info(e.toString(), e);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      fs.close(); // closing FS last so DFSOutputStream can't call close<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      LOG.info("STOPPED first instance of the cluster");<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    } finally {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      // Restart the cluster<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      while (cluster.isClusterUp()){<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        LOG.error("Waiting for cluster to go down");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        Thread.sleep(1000);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      assertFalse(cluster.isClusterUp());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      cluster = null;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      for (int i = 0; i &lt; 100; i++) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        try {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          cluster = TEST_UTIL.startMiniDFSClusterForTestWAL(namenodePort);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          break;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        } catch (BindException e) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          LOG.info("Sleeping.  BindException bringing up new cluster");<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          Threads.sleep(1000);<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>      cluster.waitActive();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      fs = cluster.getFileSystem();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      LOG.info("STARTED second instance.");<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>    // set the lease period to be 1 second so that the<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    // namenode triggers lease recovery upon append request<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    Method setLeasePeriod = cluster.getClass()<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      .getDeclaredMethod("setLeasePeriod", new Class[]{Long.TYPE, Long.TYPE});<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    setLeasePeriod.setAccessible(true);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    setLeasePeriod.invoke(cluster, 1000L, 1000L);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    try {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      Thread.sleep(1000);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    } catch (InterruptedException e) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      LOG.info(e.toString(), e);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    // Now try recovering the log, like the HMaster would do<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    final FileSystem recoveredFs = fs;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    final Configuration rlConf = conf;<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    class RecoverLogThread extends Thread {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      public Exception exception = null;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      public void run() {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          try {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            FSUtils.getInstance(fs, rlConf)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>              .recoverFileLease(recoveredFs, walPath, rlConf, null);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (IOException e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            exception = e;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>    RecoverLogThread t = new RecoverLogThread();<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    t.start();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    // Timeout after 60 sec. Without correct patches, would be an infinite loop<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    t.join(60 * 1000);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    if(t.isAlive()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      t.interrupt();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      throw new Exception("Timed out waiting for WAL.recoverLog()");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    if (t.exception != null)<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      throw t.exception;<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Make sure you can read all the content<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    WAL.Reader reader = wals.createReader(fs, walPath);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int count = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    WAL.Entry entry = new WAL.Entry();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    while (reader.next(entry) != null) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      count++;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      assertTrue("Should be one KeyValue per WALEdit",<a name="line.483"></a>
-<span class="sourceLineNo">484</span>                  entry.getEdit().getCells().size() == 1);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    assertEquals(total, count);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    reader.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Reset the lease period<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    setLeasePeriod.invoke(cluster, new Object[]{ 60000L, 3600000L });<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>  /**<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Tests that we can write out an edit, close, and then read it back in again.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  @Test<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public void testEditAdd() throws IOException {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    int colCount = 10;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    TableDescriptor htd =<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        TableDescriptorBuilder.newBuilder(TableName.valueOf(currentTest.getMethodName()))<a name="line.500"></a>
-<span class="sourceLineNo">501</span>            .setColumnFamily(ColumnFamilyDescriptorBuilder.of("column")).build();<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;byte[], Integer&gt;(Bytes.BYTES_COMPARATOR);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    for (byte[] fam : htd.getColumnFamilyNames()) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      scopes.put(fam, 0);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    byte[] row = Bytes.toBytes("row");<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    WAL.Reader reader = null;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    try {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>      // Write columns named 1, 2, 3, etc. and then values of single byte<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // 1, 2, 3...<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      long timestamp = System.currentTimeMillis();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      WALEdit cols = new WALEdit();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      for (int i = 0; i &lt; colCount; i++) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        cols.add(new KeyValue(row, Bytes.toBytes("column"),<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            Bytes.toBytes(Integer.toString(i)),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          timestamp, new byte[] { (byte)(i + '0') }));<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      RegionInfo info = RegionInfoBuilder.newBuilder(htd.getTableName()).setStartKey(row)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setEndKey(Bytes.toBytes(Bytes.toString(row) + "1")).build();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      final WAL log = wals.getWAL(info);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>      final long txid = log.append(info,<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        new WALKeyImpl(info.getEncodedNameAsBytes(), htd.getTableName(), System.currentTimeMillis(),<a name="line.525"></a>
-<span class="sourceLineNo">526</span>            mvcc, scopes),<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        cols, true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      log.sync(txid);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      log.startCacheFlush(info.getEncodedNameAsBytes(), htd.getColumnFamilyNames());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      log.completeCacheFlush(info.getEncodedNameAsBytes());<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      log.shutdown();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      Path filename = AbstractFSWALProvider.getCurrentFileName(log);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Now open a reader on the log and assert append worked.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      reader = wals.createReader(fs, filename);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      // Above we added all columns on a single row so we only read one<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // entry in the below... thats why we have '1'.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      for (int i = 0; i &lt; 1; i++) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        WAL.Entry entry = reader.next(null);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        if (entry == null) break;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        WALKey key = entry.getKey();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        WALEdit val = entry.getEdit();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        assertTrue(Bytes.equals(info.getEncodedNameAsBytes(), key.getEncodedRegionName()));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        assertTrue(htd.getTableName().equals(key.getTableName()));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Cell cell = val.getCells().get(0);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        assertTrue(Bytes.equals(row, 0, row.length, cell.getRowArray(), cell.getRowOffset(),<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          cell.getRowLength()));<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        assertEquals((byte)(i + '0'), CellUtil.cloneValue(cell)[0]);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        System.out.println(key + " " + val);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    } finally {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      if (reader != null) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        reader.close();<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><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  @Test<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  public void testAppend() throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    int colCount = 10;<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    TableDescriptor htd =<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        TableDescriptorBuilder.newBuilder(TableName.valueOf(currentTest.getMethodName()))<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            .setColumnFamily(ColumnFamilyDescriptorBuilder.of("column")).build();<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    NavigableMap&lt;byte[], Integer&gt; scopes = new TreeMap&lt;byte[], Integer&gt;(Bytes.BYTES_COMPARATOR);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    for (byte[] fam : htd.getColumnFamilyNames()) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      scopes.put(fam, 0);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    byte[] row = Bytes.toBytes("row");<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    WAL.Reader reader = null;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl(1);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    try {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      // Write columns named 1, 2, 3, etc. and then values of single byte<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      // 1, 2, 3...<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      long timestamp = System.currentTimeMillis();<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      WALEdit cols = new WALEdit();<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      for (int i = 0; i &lt; colCount; i++) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        cols.add(new KeyValue(row, Bytes.toBytes("column"),<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          Bytes.toBytes(Integer.toString(i)),<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          timestamp, new byte[] { (byte)(i + '0') }));<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      RegionInfo hri = RegionInfoBuilder.newBuilder(htd.getTableName()).build();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      final WAL log = wals.getWAL(hri);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      final long txid = log.append(hri,<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        new WALKeyImpl(hri.getEncodedNameAsBytes(), htd.getTableName(), System.currentTimeMillis(),<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            mvcc, scopes),<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        cols, true);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      log.sync(txid);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      log.startCacheFlush(hri.getEncodedNameAsBytes(), htd.getColumnFamilyNames());<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      log.completeCacheFlush(hri.getEncodedNameAsBytes());<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      log.shutdown();<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      Path filename = AbstractFSWALProvider.getCurrentFileName(log);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Now open a reader on the log and assert append worked.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      reader = wals.createReader(fs, filename);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      WAL.Entry entry = reader.next();<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      assertEquals(colCount, entry.getEdit().size());<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      int idx = 0;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      for (Cell val : entry.getEdit().getCells()) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        assertTrue(Bytes.equals(hri.getEncodedNameAsBytes(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          entry.getKey().getEncodedRegionName()));<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        assertTrue(htd.getTableName().equals(entry.getKey().getTableName()));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        assertTrue(Bytes.equals(row, 0, row.length, val.getRowArray(), val.getRowOffset(),<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          val.getRowLength()));<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        assertEquals((byte) (idx + '0'), CellUtil.cloneValue(val)[0]);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        System.out.println(entry.getKey() + " " + val);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        idx++;<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      if (reader != null) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        reader.close();<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><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  /**<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * Test that we can visit entries before 

<TRUNCATED>

[25/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html
index 939dd9d..6df7d6a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreFileReader.html
@@ -156,497 +156,503 @@
 <span class="sourceLineNo">148</span>   */<a name="line.148"></a>
 <span class="sourceLineNo">149</span>  public StoreFileScanner getStoreFileScanner(boolean cacheBlocks, boolean pread,<a name="line.149"></a>
 <span class="sourceLineNo">150</span>      boolean isCompaction, long readPt, long scannerOrder, boolean canOptimizeForNonNullColumn) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    // Increment the ref count<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    refCount.incrementAndGet();<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return new StoreFileScanner(this, getScanner(cacheBlocks, pread, isCompaction),<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        !isCompaction, reader.hasMVCCInfo(), readPt, scannerOrder, canOptimizeForNonNullColumn);<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>   * Indicate that the scanner has finished reading with this reader. We need to decrement the ref<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * count, and also, if this is not the common pread reader, we should close it.<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  void readCompleted() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    refCount.decrementAndGet();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    if (!shared) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      try {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        reader.close(false);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      } catch (IOException e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        LOG.warn("failed to close stream reader", e);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      }<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><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * @deprecated Do not write further code which depends on this call. Instead<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   *   use getStoreFileScanner() which uses the StoreFileScanner class/interface<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   *   which is the preferred way to scan a store with higher level concepts.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   *<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param cacheBlocks should we cache the blocks?<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param pread use pread (for concurrent small readers)<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @return the underlying HFileScanner<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  @Deprecated<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public HFileScanner getScanner(boolean cacheBlocks, boolean pread) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return getScanner(cacheBlocks, pread, false);<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>  /**<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @deprecated Do not write further code which depends on this call. Instead<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *   use getStoreFileScanner() which uses the StoreFileScanner class/interface<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   *   which is the preferred way to scan a store with higher level concepts.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   *<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param cacheBlocks<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *          should we cache the blocks?<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param pread<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   *          use pread (for concurrent small readers)<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * @param isCompaction<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   *          is scanner being used for compaction?<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @return the underlying HFileScanner<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  @Deprecated<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  public HFileScanner getScanner(boolean cacheBlocks, boolean pread,<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      boolean isCompaction) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    return reader.getScanner(cacheBlocks, pread, isCompaction);<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>  public void close(boolean evictOnClose) throws IOException {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    reader.close(evictOnClose);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Check if this storeFile may contain keys within the TimeRange that<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * have not expired (i.e. not older than oldestUnexpiredTS).<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param timeRange the timeRange to restrict<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @param oldestUnexpiredTS the oldest timestamp that is not expired, as<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   *          determined by the column family's TTL<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @return false if queried keys definitely don't exist in this StoreFile<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  boolean passesTimerangeFilter(TimeRange tr, long oldestUnexpiredTS) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    return this.timeRange == null? true:<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.timeRange.includesTimeRange(tr) &amp;&amp; this.timeRange.getMax() &gt;= oldestUnexpiredTS;<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>  /**<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   * Checks whether the given scan passes the Bloom filter (if present). Only<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * checks Bloom filters for single-row or single-row-column scans. Bloom<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * filter checking for multi-gets is implemented as part of the store<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * scanner system (see {@link StoreFileScanner#seek(Cell)} and uses<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * the lower-level API {@link #passesGeneralRowBloomFilter(byte[], int, int)}<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * and {@link #passesGeneralRowColBloomFilter(Cell)}.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   *<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @param scan the scan specification. Used to determine the row, and to<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   *          check whether this is a single-row ("get") scan.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param columns the set of columns. Only used for row-column Bloom<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   *          filters.<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @return true if the scan with the given column set passes the Bloom<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   *         filter, or if the Bloom filter is not applicable for the scan.<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   *         False if the Bloom filter is applicable and the scan fails it.<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   */<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  boolean passesBloomFilter(Scan scan, final SortedSet&lt;byte[]&gt; columns) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    // Multi-column non-get scans will use Bloom filters through the<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // lower-level API function that this function calls.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    if (!scan.isGetScan()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      return true;<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>    byte[] row = scan.getStartRow();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    switch (this.bloomFilterType) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      case ROW:<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        return passesGeneralRowBloomFilter(row, 0, row.length);<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      case ROWCOL:<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        if (columns != null &amp;&amp; columns.size() == 1) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          byte[] column = columns.first();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          // create the required fake key<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          Cell kvKey = PrivateCellUtil.createFirstOnRow(row, HConstants.EMPTY_BYTE_ARRAY, column);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          return passesGeneralRowColBloomFilter(kvKey);<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 multi-column queries the Bloom filter is checked from the<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        // seekExact operation.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        return true;<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>      default:<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        return true;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  public boolean passesDeleteFamilyBloomFilter(byte[] row, int rowOffset,<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      int rowLen) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Cache Bloom filter as a local variable in case it is set to null by<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    // another thread on an IO error.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    BloomFilter bloomFilter = this.deleteFamilyBloomFilter;<a name="line.271"></a>
+<span class="sourceLineNo">151</span>    return new StoreFileScanner(this, getScanner(cacheBlocks, pread, isCompaction),<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        !isCompaction, reader.hasMVCCInfo(), readPt, scannerOrder, canOptimizeForNonNullColumn);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  }<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>   * Indicate that the scanner has started reading with this reader. We need to increment the ref<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * count so reader is not close until some object is holding the lock<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  void incrementRefCount() {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    refCount.incrementAndGet();<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>   * Indicate that the scanner has finished reading with this reader. We need to decrement the ref<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * count, and also, if this is not the common pread reader, we should close it.<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   */<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  void readCompleted() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    refCount.decrementAndGet();<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    if (!shared) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      try {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        reader.close(false);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      } catch (IOException e) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        LOG.warn("failed to close stream reader", e);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @deprecated Do not write further code which depends on this call. Instead<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   *   use getStoreFileScanner() which uses the StoreFileScanner class/interface<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *   which is the preferred way to scan a store with higher level concepts.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   *<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @param cacheBlocks should we cache the blocks?<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param pread use pread (for concurrent small readers)<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * @return the underlying HFileScanner<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  @Deprecated<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public HFileScanner getScanner(boolean cacheBlocks, boolean pread) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    return getScanner(cacheBlocks, pread, 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>   * @deprecated Do not write further code which depends on this call. Instead<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   *   use getStoreFileScanner() which uses the StoreFileScanner class/interface<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   which is the preferred way to scan a store with higher level concepts.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param cacheBlocks<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   *          should we cache the blocks?<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param pread<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *          use pread (for concurrent small readers)<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param isCompaction<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          is scanner being used for compaction?<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @return the underlying HFileScanner<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  @Deprecated<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  public HFileScanner getScanner(boolean cacheBlocks, boolean pread,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      boolean isCompaction) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    return reader.getScanner(cacheBlocks, pread, isCompaction);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void close(boolean evictOnClose) throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    reader.close(evictOnClose);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  /**<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * Check if this storeFile may contain keys within the TimeRange that<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * have not expired (i.e. not older than oldestUnexpiredTS).<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @param timeRange the timeRange to restrict<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @param oldestUnexpiredTS the oldest timestamp that is not expired, as<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   *          determined by the column family's TTL<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * @return false if queried keys definitely don't exist in this StoreFile<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   */<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  boolean passesTimerangeFilter(TimeRange tr, long oldestUnexpiredTS) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    return this.timeRange == null? true:<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      this.timeRange.includesTimeRange(tr) &amp;&amp; this.timeRange.getMax() &gt;= oldestUnexpiredTS;<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>  /**<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * Checks whether the given scan passes the Bloom filter (if present). Only<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * checks Bloom filters for single-row or single-row-column scans. Bloom<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * filter checking for multi-gets is implemented as part of the store<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * scanner system (see {@link StoreFileScanner#seek(Cell)} and uses<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * the lower-level API {@link #passesGeneralRowBloomFilter(byte[], int, int)}<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * and {@link #passesGeneralRowColBloomFilter(Cell)}.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   *<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * @param scan the scan specification. Used to determine the row, and to<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   *          check whether this is a single-row ("get") scan.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param columns the set of columns. Only used for row-column Bloom<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   *          filters.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @return true if the scan with the given column set passes the Bloom<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   *         filter, or if the Bloom filter is not applicable for the scan.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   *         False if the Bloom filter is applicable and the scan fails it.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   */<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  boolean passesBloomFilter(Scan scan, final SortedSet&lt;byte[]&gt; columns) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // Multi-column non-get scans will use Bloom filters through the<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    // lower-level API function that this function calls.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (!scan.isGetScan()) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      return true;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    byte[] row = scan.getStartRow();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    switch (this.bloomFilterType) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      case ROW:<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        return passesGeneralRowBloomFilter(row, 0, row.length);<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>      case ROWCOL:<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        if (columns != null &amp;&amp; columns.size() == 1) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          byte[] column = columns.first();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          // create the required fake key<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          Cell kvKey = PrivateCellUtil.createFirstOnRow(row, HConstants.EMPTY_BYTE_ARRAY, column);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          return passesGeneralRowColBloomFilter(kvKey);<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>        // For multi-column queries the Bloom filter is checked from the<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        // seekExact operation.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        return true;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>      default:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        return true;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
 <span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // Empty file or there is no delete family at all<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (reader.getTrailer().getEntryCount() == 0 || deleteFamilyCnt == 0) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      return false;<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>    if (bloomFilter == null) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      return true;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      if (!bloomFilter.supportsAutoLoading()) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        return true;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      return bloomFilter.contains(row, rowOffset, rowLen, null);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    } catch (IllegalArgumentException e) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.error("Bad Delete Family bloom filter data -- proceeding without",<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          e);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      setDeleteFamilyBloomFilterFaulty();<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>    return true;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  /**<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * A method for checking Bloom filters. Called directly from<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * StoreFileScanner in case of a multi-column query.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   *<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @return True if passes<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public boolean passesGeneralRowBloomFilter(byte[] row, int rowOffset, int rowLen) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    BloomFilter bloomFilter = this.generalBloomFilter;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    if (bloomFilter == null) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      return true;<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>    // Used in ROW bloom<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    byte[] key = null;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (rowOffset != 0 || rowLen != row.length) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      throw new AssertionError(<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          "For row-only Bloom filters the row " + "must occupy the whole array");<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    key = row;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    return checkGeneralBloomFilter(key, null, bloomFilter);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * A method for checking Bloom filters. Called directly from<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * StoreFileScanner in case of a multi-column query.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   *<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * @param cell<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   *          the cell to check if present in BloomFilter<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * @return True if passes<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  public boolean passesGeneralRowColBloomFilter(Cell cell) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    BloomFilter bloomFilter = this.generalBloomFilter;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    if (bloomFilter == null) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      return true;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    // Used in ROW_COL bloom<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    Cell kvKey = null;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    // Already if the incoming key is a fake rowcol key then use it as it is<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    if (cell.getTypeByte() == KeyValue.Type.Maximum.getCode() &amp;&amp; cell.getFamilyLength() == 0) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      kvKey = cell;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    } else {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      kvKey = PrivateCellUtil.createFirstOnRowCol(cell);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return checkGeneralBloomFilter(null, kvKey, bloomFilter);<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>  private boolean checkGeneralBloomFilter(byte[] key, Cell kvKey, BloomFilter bloomFilter) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    // Empty file<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (reader.getTrailer().getEntryCount() == 0) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      return false;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HFileBlock bloomBlock = null;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    try {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      boolean shouldCheckBloom;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      ByteBuff bloom;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      if (bloomFilter.supportsAutoLoading()) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        bloom = null;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        shouldCheckBloom = true;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      } else {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        bloomBlock = reader.getMetaBlock(HFile.BLOOM_FILTER_DATA_KEY, true);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        bloom = bloomBlock.getBufferWithoutHeader();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        shouldCheckBloom = bloom != null;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      }<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>      if (shouldCheckBloom) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        boolean exists;<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>        // Whether the primary Bloom key is greater than the last Bloom key<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        // from the file info. For row-column Bloom filters this is not yet<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        // a sufficient condition to return false.<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        boolean keyIsAfterLast = (lastBloomKey != null);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        // hbase:meta does not have blooms. So we need not have special interpretation<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        // of the hbase:meta cells.  We can safely use Bytes.BYTES_RAWCOMPARATOR for ROW Bloom<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        if (keyIsAfterLast) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          if (bloomFilterType == BloomType.ROW) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>            keyIsAfterLast = (Bytes.BYTES_RAWCOMPARATOR.compare(key, lastBloomKey) &gt; 0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          } else {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>            keyIsAfterLast = (CellComparator.getInstance().compare(kvKey, lastBloomKeyOnlyKV)) &gt; 0;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          }<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>        if (bloomFilterType == BloomType.ROWCOL) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          // Since a Row Delete is essentially a DeleteFamily applied to all<a name="line.378"></a>
-<span class="sourceLineNo">379</span>          // columns, a file might be skipped if using row+col Bloom filter.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          // In order to ensure this file is included an additional check is<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          // required looking only for a row bloom.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          Cell rowBloomKey = PrivateCellUtil.createFirstOnRow(kvKey);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          // hbase:meta does not have blooms. So we need not have special interpretation<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          // of the hbase:meta cells.  We can safely use Bytes.BYTES_RAWCOMPARATOR for ROW Bloom<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          if (keyIsAfterLast<a name="line.385"></a>
-<span class="sourceLineNo">386</span>              &amp;&amp; (CellComparator.getInstance().compare(rowBloomKey, lastBloomKeyOnlyKV)) &gt; 0) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>            exists = false;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          } else {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>            exists =<a name="line.389"></a>
-<span class="sourceLineNo">390</span>                bloomFilter.contains(kvKey, bloom, BloomType.ROWCOL) ||<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                bloomFilter.contains(rowBloomKey, bloom, BloomType.ROWCOL);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        } else {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          exists = !keyIsAfterLast<a name="line.394"></a>
-<span class="sourceLineNo">395</span>              &amp;&amp; bloomFilter.contains(key, 0, key.length, bloom);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>        return exists;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } catch (IOException e) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      LOG.error("Error reading bloom filter data -- proceeding without",<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          e);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      setGeneralBloomFilterFaulty();<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    } catch (IllegalArgumentException e) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      LOG.error("Bad bloom filter data -- proceeding without", e);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      setGeneralBloomFilterFaulty();<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    } finally {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      // Return the bloom block so that its ref count can be decremented.<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      reader.returnBlock(bloomBlock);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    return true;<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>   * Checks whether the given scan rowkey range overlaps with the current storefile's<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * @param scan the scan specification. Used to determine the rowkey range.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * @return true if there is overlap, false otherwise<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  public boolean passesKeyRangeFilter(Scan scan) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Optional&lt;Cell&gt; firstKeyKV = this.getFirstKey();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Optional&lt;Cell&gt; lastKeyKV = this.getLastKey();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    if (!firstKeyKV.isPresent() || !lastKeyKV.isPresent()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      // the file is empty<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      return false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    if (Bytes.equals(scan.getStartRow(), HConstants.EMPTY_START_ROW) &amp;&amp;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW)) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      return true;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    byte[] smallestScanRow = scan.isReversed() ? scan.getStopRow() : scan.getStartRow();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    byte[] largestScanRow = scan.isReversed() ? scan.getStartRow() : scan.getStopRow();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    boolean nonOverLapping = (getComparator()<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        .compareRows(firstKeyKV.get(), largestScanRow, 0, largestScanRow.length) &gt; 0 &amp;&amp;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        !Bytes.equals(scan.isReversed() ? scan.getStartRow() : scan.getStopRow(),<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          HConstants.EMPTY_END_ROW)) ||<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        getComparator().compareRows(lastKeyKV.get(), smallestScanRow, 0,<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          smallestScanRow.length) &lt; 0;<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    return !nonOverLapping;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Map&lt;byte[], byte[]&gt; loadFileInfo() throws IOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Map&lt;byte [], byte []&gt; fi = reader.loadFileInfo();<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>    byte[] b = fi.get(BLOOM_FILTER_TYPE_KEY);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    if (b != null) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      bloomFilterType = BloomType.valueOf(Bytes.toString(b));<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    lastBloomKey = fi.get(LAST_BLOOM_KEY);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    if(bloomFilterType == BloomType.ROWCOL) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      lastBloomKeyOnlyKV = new KeyValue.KeyOnlyKeyValue(lastBloomKey, 0, lastBloomKey.length);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    byte[] cnt = fi.get(DELETE_FAMILY_COUNT);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    if (cnt != null) {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      deleteFamilyCnt = Bytes.toLong(cnt);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    return fi;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public void loadBloomfilter() {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    this.loadBloomfilter(BlockType.GENERAL_BLOOM_META);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    this.loadBloomfilter(BlockType.DELETE_FAMILY_BLOOM_META);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void loadBloomfilter(BlockType blockType) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    try {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      if (blockType == BlockType.GENERAL_BLOOM_META) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        if (this.generalBloomFilter != null)<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          return; // Bloom has been loaded<a name="line.470"></a>
+<span class="sourceLineNo">273</span>  public boolean passesDeleteFamilyBloomFilter(byte[] row, int rowOffset,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      int rowLen) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    // Cache Bloom filter as a local variable in case it is set to null by<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // another thread on an IO error.<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    BloomFilter bloomFilter = this.deleteFamilyBloomFilter;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>    // Empty file or there is no delete family at all<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    if (reader.getTrailer().getEntryCount() == 0 || deleteFamilyCnt == 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      return false;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    if (bloomFilter == null) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return true;<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>    try {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      if (!bloomFilter.supportsAutoLoading()) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        return true;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      return bloomFilter.contains(row, rowOffset, rowLen, null);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    } catch (IllegalArgumentException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      LOG.error("Bad Delete Family bloom filter data -- proceeding without",<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      setDeleteFamilyBloomFilterFaulty();<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>    return true;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * A method for checking Bloom filters. Called directly from<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * StoreFileScanner in case of a multi-column query.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   *<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * @return True if passes<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   */<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  public boolean passesGeneralRowBloomFilter(byte[] row, int rowOffset, int rowLen) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    BloomFilter bloomFilter = this.generalBloomFilter;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    if (bloomFilter == null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      return true;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // Used in ROW bloom<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    byte[] key = null;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    if (rowOffset != 0 || rowLen != row.length) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      throw new AssertionError(<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          "For row-only Bloom filters the row " + "must occupy the whole array");<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    key = row;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return checkGeneralBloomFilter(key, null, bloomFilter);<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 method for checking Bloom filters. Called directly from<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * StoreFileScanner in case of a multi-column query.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   *<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param cell<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *          the cell to check if present in BloomFilter<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @return True if passes<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   */<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public boolean passesGeneralRowColBloomFilter(Cell cell) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    BloomFilter bloomFilter = this.generalBloomFilter;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (bloomFilter == null) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    // Used in ROW_COL bloom<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    Cell kvKey = null;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    // Already if the incoming key is a fake rowcol key then use it as it is<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (cell.getTypeByte() == KeyValue.Type.Maximum.getCode() &amp;&amp; cell.getFamilyLength() == 0) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      kvKey = cell;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    } else {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      kvKey = PrivateCellUtil.createFirstOnRowCol(cell);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return checkGeneralBloomFilter(null, kvKey, bloomFilter);<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>  private boolean checkGeneralBloomFilter(byte[] key, Cell kvKey, BloomFilter bloomFilter) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    // Empty file<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    if (reader.getTrailer().getEntryCount() == 0) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      return false;<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    HFileBlock bloomBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      boolean shouldCheckBloom;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      ByteBuff bloom;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      if (bloomFilter.supportsAutoLoading()) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        bloom = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        shouldCheckBloom = true;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      } else {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        bloomBlock = reader.getMetaBlock(HFile.BLOOM_FILTER_DATA_KEY, true);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        bloom = bloomBlock.getBufferWithoutHeader();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        shouldCheckBloom = bloom != null;<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>      if (shouldCheckBloom) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        boolean exists;<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>        // Whether the primary Bloom key is greater than the last Bloom key<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        // from the file info. For row-column Bloom filters this is not yet<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        // a sufficient condition to return false.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        boolean keyIsAfterLast = (lastBloomKey != null);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        // hbase:meta does not have blooms. So we need not have special interpretation<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // of the hbase:meta cells.  We can safely use Bytes.BYTES_RAWCOMPARATOR for ROW Bloom<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (keyIsAfterLast) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          if (bloomFilterType == BloomType.ROW) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            keyIsAfterLast = (Bytes.BYTES_RAWCOMPARATOR.compare(key, lastBloomKey) &gt; 0);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          } else {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>            keyIsAfterLast = (CellComparator.getInstance().compare(kvKey, lastBloomKeyOnlyKV)) &gt; 0;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        }<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>        if (bloomFilterType == BloomType.ROWCOL) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          // Since a Row Delete is essentially a DeleteFamily applied to all<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          // columns, a file might be skipped if using row+col Bloom filter.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          // In order to ensure this file is included an additional check is<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          // required looking only for a row bloom.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          Cell rowBloomKey = PrivateCellUtil.createFirstOnRow(kvKey);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          // hbase:meta does not have blooms. So we need not have special interpretation<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          // of the hbase:meta cells.  We can safely use Bytes.BYTES_RAWCOMPARATOR for ROW Bloom<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          if (keyIsAfterLast<a name="line.391"></a>
+<span class="sourceLineNo">392</span>              &amp;&amp; (CellComparator.getInstance().compare(rowBloomKey, lastBloomKeyOnlyKV)) &gt; 0) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>            exists = false;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          } else {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>            exists =<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                bloomFilter.contains(kvKey, bloom, BloomType.ROWCOL) ||<a name="line.396"></a>
+<span class="sourceLineNo">397</span>                bloomFilter.contains(rowBloomKey, bloom, BloomType.ROWCOL);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        } else {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          exists = !keyIsAfterLast<a name="line.400"></a>
+<span class="sourceLineNo">401</span>              &amp;&amp; bloomFilter.contains(key, 0, key.length, bloom);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>        return exists;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    } catch (IOException e) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      LOG.error("Error reading bloom filter data -- proceeding without",<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          e);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      setGeneralBloomFilterFaulty();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    } catch (IllegalArgumentException e) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      LOG.error("Bad bloom filter data -- proceeding without", e);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      setGeneralBloomFilterFaulty();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      // Return the bloom block so that its ref count can be decremented.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      reader.returnBlock(bloomBlock);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    return true;<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>   * Checks whether the given scan rowkey range overlaps with the current storefile's<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @param scan the scan specification. Used to determine the rowkey range.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * @return true if there is overlap, false otherwise<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public boolean passesKeyRangeFilter(Scan scan) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    Optional&lt;Cell&gt; firstKeyKV = this.getFirstKey();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    Optional&lt;Cell&gt; lastKeyKV = this.getLastKey();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    if (!firstKeyKV.isPresent() || !lastKeyKV.isPresent()) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      // the file is empty<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      return false;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    if (Bytes.equals(scan.getStartRow(), HConstants.EMPTY_START_ROW) &amp;&amp;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW)) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      return true;<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] smallestScanRow = scan.isReversed() ? scan.getStopRow() : scan.getStartRow();<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    byte[] largestScanRow = scan.isReversed() ? scan.getStartRow() : scan.getStopRow();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    boolean nonOverLapping = (getComparator()<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        .compareRows(firstKeyKV.get(), largestScanRow, 0, largestScanRow.length) &gt; 0 &amp;&amp;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        !Bytes.equals(scan.isReversed() ? scan.getStartRow() : scan.getStopRow(),<a name="line.440"></a>
+<span class="sourceLineNo">441</span>          HConstants.EMPTY_END_ROW)) ||<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        getComparator().compareRows(lastKeyKV.get(), smallestScanRow, 0,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          smallestScanRow.length) &lt; 0;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return !nonOverLapping;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public Map&lt;byte[], byte[]&gt; loadFileInfo() throws IOException {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Map&lt;byte [], byte []&gt; fi = reader.loadFileInfo();<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    byte[] b = fi.get(BLOOM_FILTER_TYPE_KEY);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    if (b != null) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      bloomFilterType = BloomType.valueOf(Bytes.toString(b));<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>    lastBloomKey = fi.get(LAST_BLOOM_KEY);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    if(bloomFilterType == BloomType.ROWCOL) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      lastBloomKeyOnlyKV = new KeyValue.KeyOnlyKeyValue(lastBloomKey, 0, lastBloomKey.length);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    }<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    byte[] cnt = fi.get(DELETE_FAMILY_COUNT);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    if (cnt != null) {<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      deleteFamilyCnt = Bytes.toLong(cnt);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span><a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return fi;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public void loadBloomfilter() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.loadBloomfilter(BlockType.GENERAL_BLOOM_META);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.loadBloomfilter(BlockType.DELETE_FAMILY_BLOOM_META);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
 <span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>        DataInput bloomMeta = reader.getGeneralBloomFilterMetadata();<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (bloomMeta != null) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // sanity check for NONE Bloom filter<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          if (bloomFilterType == BloomType.NONE) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>            throw new IOException(<a name="line.476"></a>
-<span class="sourceLineNo">477</span>                "valid bloom filter type not found in FileInfo");<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          } else {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>            generalBloomFilter = BloomFilterFactory.createFromMeta(bloomMeta,<a name="line.479"></a>
-<span class="sourceLineNo">480</span>                reader);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>            if (LOG.isTraceEnabled()) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>              LOG.trace("Loaded " + bloomFilterType.toString() + " "<a name="line.482"></a>
-<span class="sourceLineNo">483</span>                + generalBloomFilter.getClass().getSimpleName()<a name="line.483"></a>
-<span class="sourceLineNo">484</span>                + " metadata for " + reader.getName());<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else if (blockType == BlockType.DELETE_FAMILY_BLOOM_META) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        if (this.deleteFamilyBloomFilter != null)<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          return; // Bloom has been loaded<a name="line.490"></a>
-<span class="sourceLineNo">491</span><a name="line.491"></a>
-<span class="sourceLineNo">492</span>        DataInput bloomMeta = reader.getDeleteBloomFilterMetadata();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        if (bloomMeta != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          deleteFamilyBloomFilter = BloomFilterFactory.createFromMeta(<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              bloomMeta, reader);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          LOG.info("Loaded Delete Family Bloom ("<a name="line.496"></a>
-<span class="sourceLineNo">497</span>              + deleteFamilyBloomFilter.getClass().getSimpleName()<a name="line.497"></a>
-<span class="sourceLineNo">498</span>              + ") metadata for " + reader.getName());<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      } else {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        throw new RuntimeException("Block Type: " + blockType.toString()<a name="line.501"></a>
-<span class="sourceLineNo">502</span>            + "is not supported for Bloom filter");<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    } catch (IOException e) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      LOG.error("Error reading bloom filter meta for " + blockType<a name="line.505"></a>
-<span class="sourceLineNo">506</span>          + " -- proceeding without", e);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      setBloomFilterFaulty(blockType);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    } catch (IllegalArgumentException e) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      LOG.error("Bad bloom filter meta " + blockType<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          + " -- proceeding without", e);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      setBloomFilterFaulty(blockType);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  private void setBloomFilterFaulty(BlockType blockType) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    if (blockType == BlockType.GENERAL_BLOOM_META) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      setGeneralBloomFilterFaulty();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    } else if (blockType == BlockType.DELETE_FAMILY_BLOOM_META) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      setDeleteFamilyBloomFilterFaulty();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    }<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>  /**<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   * The number of Bloom filter entries in this store file, or an estimate<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   * thereof, if the Bloom filter is not loaded. This always returns an upper<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   * bound of the number of Bloom filter entries.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   *<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * @return an estimate of the number of Bloom filter entries in this file<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  public long getFilterEntries() {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    return generalBloomFilter != null ? generalBloomFilter.getKeyCount()<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        : reader.getEntries();<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>  public void setGeneralBloomFilterFaulty() {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    generalBloomFilter = null;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  public void setDeleteFamilyBloomFilterFaulty() {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    this.deleteFamilyBloomFilter = null;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>  }<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>  public Optional&lt;Cell&gt; getLastKey() {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    return reader.getLastKey();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  public Optional&lt;byte[]&gt; getLastRowKey() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return reader.getLastRowKey();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public Optional&lt;Cell&gt; midKey() throws IOException {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    return reader.midKey();<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>  public long length() {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    return reader.length();<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>  public long getTotalUncompressedBytes() {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    return reader.getTrailer().getTotalUncompressedBytes();<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>  public long getEntries() {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    return reader.getEntries();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public long getDeleteFamilyCnt() {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return deleteFamilyCnt;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  public Optional&lt;Cell&gt; getFirstKey() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    return reader.getFirstKey();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  }<a name="line.573"></a>
-<span class="sourceLineNo">574</span><a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public long indexSize() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    return reader.indexSize();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  }<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public BloomType getBloomFilterType() {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    return this.bloomFilterType;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>  public long getSequenceID() {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    return sequenceID;<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  }<a name="line.585"></a>
-<span class="sourceLineNo">586</span><a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public void setSequenceID(long sequenceID) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    this.sequenceID = sequenceID;<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>  public void setBulkLoaded(boolean bulkLoadResult) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    this.bulkLoadResult = bulkLoadResult;<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>  public boolean isBulkLoaded() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    return this.bulkLoadResult;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>  }<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>  BloomFilter getGeneralBloomFilter() {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    return generalBloomFilter;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>  long getUncompressedDataIndexSize() {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    return reader.getTrailer().getUncompressedDataIndexSize();<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>  public long getTotalBloomSize() {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    if (generalBloomFilter == null)<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      return 0;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    return generalBloomFilter.getByteSize();<a name="line.610"></a>
+<span class="sourceLineNo">472</span>  public void loadBloomfilter(BlockType blockType) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    try {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      if (blockType == BlockType.GENERAL_BLOOM_META) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        if (this.generalBloomFilter != null)<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return; // Bloom has been loaded<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>        DataInput bloomMeta = reader.getGeneralBloomFilterMetadata();<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        if (bloomMeta != null) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          // sanity check for NONE Bloom filter<a name="line.480"></a>
+<span class="sourceLineNo">481</span>          if (bloomFilterType == BloomType.NONE) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>            throw new IOException(<a name="line.482"></a>
+<span class="sourceLineNo">483</span>                "valid bloom filter type not found in FileInfo");<a name="line.483"></a>
+<span class="sourceLineNo">484</span>          } else {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            generalBloomFilter = BloomFilterFactory.createFromMeta(bloomMeta,<a name="line.485"></a>
+<span class="sourceLineNo">486</span>                reader);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>            if (LOG.isTraceEnabled()) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>              LOG.trace("Loaded " + bloomFilterType.toString() + " "<a name="line.488"></a>
+<span class="sourceLineNo">489</span>                + generalBloomFilter.getClass().getSimpleName()<a name="line.489"></a>
+<span class="sourceLineNo">490</span>                + " metadata for " + reader.getName());<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>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      } else if (blockType == BlockType.DELETE_FAMILY_BLOOM_META) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (this.deleteFamilyBloomFilter != null)<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          return; // Bloom has been loaded<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>        DataInput bloomMeta = reader.getDeleteBloomFilterMetadata();<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        if (bloomMeta != null) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          deleteFamilyBloomFilter = BloomFilterFactory.createFromMeta(<a name="line.500"></a>
+<span class="sourceLineNo">501</span>              bloomMeta, reader);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          LOG.info("Loaded Delete Family Bloom ("<a name="line.502"></a>
+<span class="sourceLineNo">503</span>              + deleteFamilyBloomFilter.getClass().getSimpleName()<a name="line.503"></a>
+<span class="sourceLineNo">504</span>              + ") metadata for " + reader.getName());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      } else {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>        throw new RuntimeException("Block Type: " + blockType.toString()<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            + "is not supported for Bloom filter");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    } catch (IOException e) {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      LOG.error("Error reading bloom filter meta for " + blockType<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          + " -- proceeding without", e);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      setBloomFilterFaulty(blockType);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    } catch (IllegalArgumentException e) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      LOG.error("Bad bloom filter meta " + blockType<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          + " -- proceeding without", e);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      setBloomFilterFaulty(blockType);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private void setBloomFilterFaulty(BlockType blockType) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    if (blockType == BlockType.GENERAL_BLOOM_META) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      setGeneralBloomFilterFaulty();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } else if (blockType == BlockType.DELETE_FAMILY_BLOOM_META) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      setDeleteFamilyBloomFilterFaulty();<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><a name="line.528"></a>
+<span class="sourceLineNo">529</span>  /**<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * The number of Bloom filter entries in this store file, or an estimate<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * thereof, if the Bloom filter is not loaded. This always returns an upper<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   * bound of the number of Bloom filter entries.<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   *<a name="line.533"></a>
+<span class="sourceLineNo">534</span>   * @return an estimate of the number of Bloom filter entries in this file<a name="line.534"></a>
+<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  public long getFilterEntries() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    return generalBloomFilter != null ? generalBloomFilter.getKeyCount()<a name="line.537"></a>
+<span class="sourceLineNo">538</span>        : reader.getEntries();<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>  public void setGeneralBloomFilterFaulty() {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    generalBloomFilter = null;<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>  public void setDeleteFamilyBloomFilterFaulty() {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    this.deleteFamilyBloomFilter = null;<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>  public Optional&lt;Cell&gt; getLastKey() {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    return reader.getLastKey();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>  public Optional&lt;byte[]&gt; getLastRowKey() {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    return reader.getLastRowKey();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
+<span class="sourceLineNo">556</span><a name="line.556"></a>
+<span class="sourceLineNo">557</span>  public Optional&lt;Cell&gt; midKey() throws IOException {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    return reader.midKey();<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>  public long length() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    return reader.length();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public long getTotalUncompressedBytes() {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    return reader.getTrailer().getTotalUncompressedBytes();<a name="line.566"></a>
+<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public long getEntries() {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    return reader.getEntries();<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>  public long getDeleteFamilyCnt() {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    return deleteFamilyCnt;<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>  public Optional&lt;Cell&gt; getFirstKey() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    return reader.getFirstKey();<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>  public long indexSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    return reader.indexSize();<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>  public BloomType getBloomFilterType() {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    return this.bloomFilterType;<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>  public long getSequenceID() {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    return sequenceID;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  }<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void setSequenceID(long sequenceID) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    this.sequenceID = sequenceID;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>  }<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void setBulkLoaded(boolean bulkLoadResult) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    this.bulkLoadResult = bulkLoadResult;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>  }<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>  public boolean isBulkLoaded() {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    return this.bulkLoadResult;<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>  BloomFilter getGeneralBloomFilter() {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    return generalBloomFilter;<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>  long getUncompressedDataIndexSize() {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    return reader.getTrailer().getUncompressedDataIndexSize();<a name="line.610"></a>
 <span class="sourceLineNo">611</span>  }<a name="line.611"></a>
 <span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  public int getHFileVersion() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    return reader.getTrailer().getMajorVersion();<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  }<a name="lin

<TRUNCATED>

[14/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
index c658da2..3c4d549 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.MasterSyncObserver.html
@@ -56,710 +56,730 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.Waiter;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.zookeeper.KeeperException;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.junit.After;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.junit.AfterClass;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.junit.BeforeClass;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.junit.ClassRule;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.junit.Test;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.experimental.categories.Category;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.slf4j.Logger;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.slf4j.LoggerFactory;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>@Category(MediumTests.class)<a name="line.95"></a>
-<span class="sourceLineNo">096</span>public class TestNamespaceAuditor {<a name="line.96"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.zookeeper.KeeperException;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.After;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.AfterClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.BeforeClass;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.ClassRule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.slf4j.Logger;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.slf4j.LoggerFactory;<a name="line.96"></a>
 <span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @ClassRule<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static Admin ADMIN;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private String prefix = "TestNamespaceAuditor";<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @BeforeClass<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static void before() throws Exception {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    Configuration conf = UTIL.getConfiguration();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    conf.setStrings(<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      RegionServerObserver.class);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    UTIL.startMiniCluster(1, 1);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    waitForQuotaInitialize(UTIL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static void tearDown() throws Exception {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    UTIL.shutdownMiniCluster();<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>  @After<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void cleanup() throws Exception, KeeperException {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      ADMIN.disableTable(table.getTableName());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      deleteTable(table.getTableName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (ns.getName().startsWith(prefix)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        ADMIN.deleteNamespace(ns.getName());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public void testTableOperations() throws Exception {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    String nsp = prefix + "_np2";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    NamespaceDescriptor nspDesc =<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.147"></a>
-<span class="sourceLineNo">148</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ADMIN.createNamespace(nspDesc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    HTableDescriptor tableDescOne =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    tableDescOne.addFamily(fam1);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    HTableDescriptor tableDescTwo =<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    tableDescTwo.addFamily(fam1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    HTableDescriptor tableDescThree =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    tableDescThree.addFamily(fam1);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    ADMIN.createTable(tableDescOne);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    boolean constraintViolated = false;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    } catch (Exception exp) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      assertTrue(exp instanceof IOException);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      constraintViolated = true;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } finally {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        constraintViolated);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertNotNull(nspState);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    constraintViolated = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    try {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      ADMIN.createTable(tableDescThree);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } catch (Exception exp) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertTrue(exp instanceof IOException);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      constraintViolated = true;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        constraintViolated);<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><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @Test<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  public void testValidQuotas() throws Exception {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    boolean exceptionCaught = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    NamespaceDescriptor nspDesc =<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.198"></a>
-<span class="sourceLineNo">199</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      ADMIN.createNamespace(nspDesc);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } catch (Exception exp) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      LOG.warn(exp.toString(), exp);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      exceptionCaught = true;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    } finally {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      assertTrue(exceptionCaught);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    nspDesc =<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.211"></a>
-<span class="sourceLineNo">212</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      ADMIN.createNamespace(nspDesc);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    } catch (Exception exp) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.warn(exp.toString(), exp);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      exceptionCaught = true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    } finally {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      assertTrue(exceptionCaught);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    nspDesc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      ADMIN.createNamespace(nspDesc);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    } catch (Exception exp) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      LOG.warn(exp.toString(), exp);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      exceptionCaught = true;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    } finally {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      assertTrue(exceptionCaught);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    nspDesc =<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      ADMIN.createNamespace(nspDesc);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    } catch (Exception exp) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      LOG.warn(exp.toString(), exp);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      exceptionCaught = true;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } finally {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      assertTrue(exceptionCaught);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  public void testDeleteTable() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    String namespace = prefix + "_dummy";<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    NamespaceDescriptor nspDesc =<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        NamespaceDescriptor.create(namespace)<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    ADMIN.createNamespace(nspDesc);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HTableDescriptor tableDescOne =<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    tableDescOne.addFamily(fam1);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HTableDescriptor tableDescTwo =<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    tableDescTwo.addFamily(fam1);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    ADMIN.createTable(tableDescOne);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    deleteTable(tableDescOne.getTableName());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    deleteTable(tableDescTwo.getTableName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    ADMIN.deleteNamespace(namespace);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    stateInfo = getNamespaceState(namespace);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    assertNull("Namespace state not found to be null.", stateInfo);<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 static class CPRegionServerObserver<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private volatile boolean shouldFailMerge = false;<a name="line.290"></a>
-<span class="sourceLineNo">291</span><a name="line.291"></a>
-<span class="sourceLineNo">292</span>    public void failMerge(boolean fail) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      shouldFailMerge = fail;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>    private boolean triggered = false;<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      while (!triggered) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        wait();<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><a name="line.303"></a>
-<span class="sourceLineNo">304</span>    @Override<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return Optional.of(this);<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><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private volatile boolean shouldFailMerge = false;<a name="line.311"></a>
+<span class="sourceLineNo">098</span>@Category(MediumTests.class)<a name="line.98"></a>
+<span class="sourceLineNo">099</span>public class TestNamespaceAuditor {<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @ClassRule<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private static Admin ADMIN;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private String prefix = "TestNamespaceAuditor";<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @BeforeClass<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static void before() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Configuration conf = UTIL.getConfiguration();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    conf.setStrings(<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      RegionServerObserver.class);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    UTIL.startMiniCluster(1, 1);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    waitForQuotaInitialize(UTIL);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static void tearDown() throws Exception {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    UTIL.shutdownMiniCluster();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @After<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public void cleanup() throws Exception, KeeperException {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      ADMIN.disableTable(table.getTableName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      deleteTable(table.getTableName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if (ns.getName().startsWith(prefix)) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        ADMIN.deleteNamespace(ns.getName());<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>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void testTableOperations() throws Exception {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    String nsp = prefix + "_np2";<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    NamespaceDescriptor nspDesc =<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    ADMIN.createNamespace(nspDesc);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>    HTableDescriptor tableDescOne =<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    tableDescOne.addFamily(fam1);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    HTableDescriptor tableDescTwo =<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    tableDescTwo.addFamily(fam1);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    HTableDescriptor tableDescThree =<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    tableDescThree.addFamily(fam1);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    ADMIN.createTable(tableDescOne);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    boolean constraintViolated = false;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    try {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    } catch (Exception exp) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      assertTrue(exp instanceof IOException);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      constraintViolated = true;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    } finally {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        constraintViolated);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    assertNotNull(nspState);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    constraintViolated = false;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    try {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      ADMIN.createTable(tableDescThree);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    } catch (Exception exp) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      assertTrue(exp instanceof IOException);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      constraintViolated = true;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        constraintViolated);<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><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @Test<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void testValidQuotas() throws Exception {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    boolean exceptionCaught = false;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    NamespaceDescriptor nspDesc =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    try {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      ADMIN.createNamespace(nspDesc);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception exp) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      LOG.warn(exp.toString(), exp);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      exceptionCaught = true;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } finally {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      assertTrue(exceptionCaught);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    nspDesc =<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.213"></a>
+<span class="sourceLineNo">214</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.214"></a>
+<span class="sourceLineNo">215</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    try {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      ADMIN.createNamespace(nspDesc);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    } catch (Exception exp) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      LOG.warn(exp.toString(), exp);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      exceptionCaught = true;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(exceptionCaught);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    nspDesc =<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      ADMIN.createNamespace(nspDesc);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    } catch (Exception exp) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      LOG.warn(exp.toString(), exp);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      exceptionCaught = true;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    } finally {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertTrue(exceptionCaught);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    nspDesc =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.239"></a>
+<span class="sourceLineNo">240</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    try {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      ADMIN.createNamespace(nspDesc);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } catch (Exception exp) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      LOG.warn(exp.toString(), exp);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      exceptionCaught = true;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    } finally {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      assertTrue(exceptionCaught);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Test<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void testDeleteTable() throws Exception {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    String namespace = prefix + "_dummy";<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    NamespaceDescriptor nspDesc =<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        NamespaceDescriptor.create(namespace)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    ADMIN.createNamespace(nspDesc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    HTableDescriptor tableDescOne =<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    tableDescOne.addFamily(fam1);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    HTableDescriptor tableDescTwo =<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    tableDescTwo.addFamily(fam1);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    ADMIN.createTable(tableDescOne);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    deleteTable(tableDescOne.getTableName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    deleteTable(tableDescTwo.getTableName());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    ADMIN.deleteNamespace(namespace);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    stateInfo = getNamespaceState(namespace);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    assertNull("Namespace state not found to be null.", stateInfo);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  public static class CPRegionServerObserver<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    private volatile boolean shouldFailMerge = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    public void failMerge(boolean fail) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      shouldFailMerge = fail;<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>    private boolean triggered = false;<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      while (!triggered) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        wait();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    @Override<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return Optional.of(this);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    public void failMerge(boolean fail) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      shouldFailMerge = fail;<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>    @Override<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      return Optional.of(this);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    @Override<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    public synchronized void preMergeRegionsAction(<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      notifyAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (shouldFailMerge) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new IOException("fail merge");<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  @Test<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  public void testRegionMerge() throws Exception {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    String nsp1 = prefix + "_regiontest";<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    final int initialRegions = 3;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    NamespaceDescriptor nspDesc =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        NamespaceDescriptor.create(nsp1)<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    ADMIN.createNamespace(nspDesc);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    ADMIN.flush(tableTwo);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    assertEquals(initialRegions, hris.size());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      false);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    f.get(10, TimeUnit.SECONDS);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    regionToSplit.compact(true);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // wait a while to let the ongoing compaction finish.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    UTIL.waitFor(10000, regionToSplit::isSplittable);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    ADMIN.splitRegionAsync(regionToSplit.getRegionInfo().getRegionName(), splitKey).get(10,<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      TimeUnit.SECONDS);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(initialRegions, hris.size());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // Fail region merge through Coprocessor hook<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    MiniHBaseCluster cluster = UTIL.getHBaseCluster();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    MasterCoprocessorHost cpHost = cluster.getMaster().getMasterCoprocessorHost();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Coprocessor coprocessor = cpHost.findCoprocessor(CPMasterObserver.class);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    CPMasterObserver masterObserver = (CPMasterObserver) coprocessor;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    masterObserver.failMerge(true);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    f = ADMIN.mergeRegionsAsync(<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      hris.get(2).getEncodedNameAsBytes(),<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      false);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    try {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      f.get(10, TimeUnit.SECONDS);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      fail("Merge was supposed to fail!");<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    } catch (ExecutionException ee) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      // Expected.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(initialRegions, hris.size());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // verify that we cannot split<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    try {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      fail();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    } catch (DoNotRetryRegionException e) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      // Expected<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    Thread.sleep(2000);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    assertEquals(initialRegions, ADMIN.getRegions(tableTwo).size());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  /*<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   * Create a table and make sure that the table creation fails after adding this table entry into<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * namespace quota cache. Now correct the failure and recreate the table with same name.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * HBASE-13394<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   */<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  @Test<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public void testRecreateTableWithSameNameAfterFirstTimeFailure() throws Exception {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    String nsp1 = prefix + "_testRecreateTable";<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    NamespaceDescriptor nspDesc =<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        NamespaceDescriptor.create(nsp1)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "1").build();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    ADMIN.createNamespace(nspDesc);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    final TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    MasterSyncObserver.throwExceptionInPreCreateTableAction = true;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        ADMIN.createTable(tableDescOne);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        fail("Table " + tableOne.toString() + "creation should fail.");<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      } catch (Exception exp) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        LOG.error(exp.toString(), exp);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      assertFalse(ADMIN.tableExists(tableOne));<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp1);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      assertEquals("First table creation failed in namespace so number of tables in namespace "<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          + "should be 0.", 0, nstate.getTables().size());<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      try {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        ADMIN.createTable(tableDescOne);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      } catch (Exception e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        fail("Table " + tableOne.toString() + "creation should succeed.");<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        LOG.error(e.toString(), e);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertTrue(ADMIN.tableExists(tableOne));<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      nstate = getNamespaceState(nsp1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      assertEquals("First table was created successfully so table size in namespace should "<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          + "be one now.", 1, nstate.getTables().size());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } finally {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      if (ADMIN.tableExists(tableOne)) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        ADMIN.disableTable(tableOne);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        deleteTable(tableOne);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      ADMIN.deleteNamespace(nsp1);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    }<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>  private NamespaceTableAndRegionInfo getNamespaceState(String namespace) throws KeeperException,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getQuotaManager().getState(namespace);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  byte[] getSplitKey(byte[] startKey, byte[] endKey) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    String skey = Bytes.toString(startKey);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    int key;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    if (StringUtils.isBlank(skey)) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      key = Integer.parseInt(Bytes.toString(endKey))/2 ;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    } else {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      key = (int) (Integer.parseInt(skey) * 1.5);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    return Bytes.toBytes("" + key);<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>  public static class CustomObserver implements RegionCoprocessor, RegionObserver {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    volatile CountDownLatch postCompact;<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        throws IOException {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      postCompact.countDown();<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      postCompact = new CountDownLatch(1);<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>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return Optional.of(this);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Test<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public void testStatePreserve() throws Exception {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    final String nsp1 = prefix + "_testStatePreserve";<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp1)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "10").build();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    ADMIN.createNamespace(nspDesc);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    TableName tableThree = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table3");<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    tableDescOne.addFamily(fam1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    HTableDescriptor tableDescTwo = new HTableDescriptor(tableTwo);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    tableDescTwo.addFamily(fam1);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    HTableDescriptor tableDescThree = new HTableDescriptor(tableThree);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    tableDescThree.addFamily(fam1);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    ADMIN.createTable(tableDescThree, Bytes.toBytes("1"), Bytes.toBytes("1000"), 4);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    ADMIN.disableTable(tableThree);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    deleteTable(tableThree);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    // wait for chore to complete<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    UTIL.waitFor(1000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      @Override<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      public boolean evaluate() throws Exception {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>       return (getNamespaceState(nsp1).getTables().size() == 2);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    });<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    NamespaceTableAndRegionInfo before = getNamespaceState(nsp1);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    restartMaster();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    NamespaceTableAndRegionInfo after = getNamespaceState(nsp1);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    assertEquals("Expected: " + before.getTables() + " Found: " + after.getTables(), before<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        .getTables().size(), after.getTables().size());<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void waitForQuotaInitialize(final HBaseTestingUtility util) throws Exception {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    util.waitFor(60000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      public boolean evaluate() throws Exception {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        HMaster master = util.getHBaseCluster().getMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (master == null) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          return false;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        MasterQuotaManager quotaManager = master.getMasterQuotaManager();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        return quotaManager != null &amp;&amp; quotaManager.isQuotaInitialized();<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>  }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  private void restartMaster() throws Exception {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    UTIL.getHBaseCluster().getMaster(0).stop("Stopping to start again");<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    UTIL.getHBaseCluster().waitOnMaster(0);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    UTIL.getHBaseCluster().startMaster();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    waitForQuotaInitialize(UTIL);<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>  private NamespaceAuditor getQuotaManager() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return UTIL.getHBaseCluster().getMaster()<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        .getMasterQuotaManager().getNamespaceQuotaManager();<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>  public static class MasterSyncObserver implements MasterCoprocessor, MasterObserver {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    volatile CountDownLatch tableDeletionLatch;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    static boolean throwExceptionInPreCreateTableAction;<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      return Optional.of(this);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>    @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    public void preDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        TableName tableName) throws IOException {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      tableDeletionLatch = new CountDownLatch(1);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
+<span class="sourceLineNo">313</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private volatile boolean shouldFailMerge = false;<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public void failMerge(boolean fail) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      shouldFailMerge = fail;<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>    @Override<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      return Optional.of(this);<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>    @Override<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    public synchronized void preMergeRegionsAction(<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      notifyAll();<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (shouldFailMerge) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        throw new IOException("fail merge");<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>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  @Test<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public void testRegionMerge() throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    String nsp1 = prefix + "_regiontest";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    final int initialRegions = 3;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    NamespaceDescriptor nspDesc =<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        NamespaceDescriptor.create(nsp1)<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ADMIN.createNamespace(nspDesc);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    ADMIN.flush(tableTwo);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    assertEquals(initialRegions, hris.size());<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      false);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    f.get(10, TimeUnit.SECONDS);<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    regionToSplit.compact(true);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    // Waiting for compaction to finish<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    UTIL.waitFor(30000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      @Override<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      public boolean evaluate() throws Exception {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        return (CompactionState.NONE == ADMIN<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            .getCompactionStateForRegion(regionToSplit.getRegionInfo().getRegionName()));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    });<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // Cleaning compacted references for split to proceed<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    regionToSplit.getStores().stream().forEach(s -&gt; {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      try {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        s.closeAndArchiveCompactedFiles();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      } catch (IOException e1) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        LOG.error("Error whiling cleaning compacted file");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    });<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    // wait a while to let the ongoing compaction finish.<a name="line.389"></a>
+<span class="sourceL

<TRUNCATED>

[07/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
index a369370..295a1d4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.CustomSplitPolicy.html
@@ -39,989 +39,1006 @@
 <span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.Optional;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.ServerName;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Get;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Put;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Table;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.zookeeper.KeeperException;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.After;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.junit.AfterClass;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.junit.Assert;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.junit.Before;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.junit.BeforeClass;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.junit.ClassRule;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.junit.Rule;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.junit.Test;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.junit.experimental.categories.Category;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.junit.rules.TestName;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.slf4j.Logger;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.slf4j.LoggerFactory;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * The below tests are testing split region against a running cluster<a name="line.113"></a>
-<span class="sourceLineNo">114</span> */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.115"></a>
-<span class="sourceLineNo">116</span>@SuppressWarnings("deprecation")<a name="line.116"></a>
-<span class="sourceLineNo">117</span>public class TestSplitTransactionOnCluster {<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @ClassRule<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private Admin admin = null;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private MiniHBaseCluster cluster = null;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static final int NB_SERVERS = 3;<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    new HBaseTestingUtility();<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  @Rule<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  public TestName name = new TestName();<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @BeforeClass public static void before() throws Exception {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  @AfterClass public static void after() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TESTING_UTIL.shutdownMiniCluster();<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>  @Before public void setup() throws IOException {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  @After<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  public void tearDown() throws Exception {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    this.admin.close();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      TESTING_UTIL.deleteTable(htd.getTableName());<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>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throws IOException, InterruptedException {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(1, regions.size());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    try {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchProcedureException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return hri;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private void requestSplitRegion(<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      final HRegionServer rsServer,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      final Region region,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      final byte[] midKey) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testRITStateForRollback() throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    final HMaster master = cluster.getMaster();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    try {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      // Create table then get the single region for our new table.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      insertData(tableName, admin, t);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      t.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      this.admin.setBalancerRunning(false, true);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      master.setCatalogJanitorEnabled(false);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // find a splittable region<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      final HRegion region = findSplittableRegion(regions);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // install master co-processor to fail splits<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      master.getMasterCoprocessorHost().load(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        FailingSplitMasterObserver.class,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        Coprocessor.PRIORITY_USER,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        master.getConfiguration());<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // split async<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      FailingSplitMasterObserver observer =<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      assertNotNull(observer);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      observer.latch.await();<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        Threads.sleep(100);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      admin.setBalancerRunning(true, false);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      master.setCatalogJanitorEnabled(true);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      abortAndWaitForMaster();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      TESTING_UTIL.deleteTable(tableName);<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  @Test<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // Create table then get the single region for our new table.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    admin.createTable(htd);<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Thread.sleep(100);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    HStore store = region.getStore(cf);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // insert data<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    insertData(tableName, admin, t);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    insertData(tableName, admin, t);<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int fileNum = store.getStorefiles().size();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // 0, Compaction Request<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    store.triggerMajorCompaction();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertTrue(cc.isPresent());<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // 1, A timeout split<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    // 1.1 close region<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // 1.2 rollback and Region initialize again<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    region.initialize();<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // 2, Run Compaction cc<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // 3, Split<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    volatile CountDownLatch latch;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      latch = new CountDownLatch(1);<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>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return Optional.of(this);<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>    @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    public void preSplitRegionBeforeMETAAction(<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        final byte[] splitKey,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      latch.countDown();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      throw new IOException("Causing rollback of region split");<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><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  @Test<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    // Create table then get the single region for our new table.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.305"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.conf.Configuration;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.FileSystem;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.fs.Path;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.ServerName;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Get;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Put;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Result;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Table;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.TestReplicasClient.SlowMeCopro;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.master.MasterRpcServices;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.master.NoSuchProcedureException;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.master.assignment.RegionStates;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.zookeeper.KeeperException;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.junit.After;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.junit.AfterClass;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.junit.Assert;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.junit.Before;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.junit.BeforeClass;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.junit.ClassRule;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.junit.Rule;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.junit.Test;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.junit.experimental.categories.Category;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.junit.rules.TestName;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.slf4j.Logger;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.slf4j.LoggerFactory;<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> * The below tests are testing split region against a running cluster<a name="line.115"></a>
+<span class="sourceLineNo">116</span> */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.117"></a>
+<span class="sourceLineNo">118</span>@SuppressWarnings("deprecation")<a name="line.118"></a>
+<span class="sourceLineNo">119</span>public class TestSplitTransactionOnCluster {<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  @ClassRule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      HBaseClassTestRule.forClass(TestSplitTransactionOnCluster.class);<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSplitTransactionOnCluster.class);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private Admin admin = null;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private MiniHBaseCluster cluster = null;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static final int NB_SERVERS = 3;<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  static final HBaseTestingUtility TESTING_UTIL =<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    new HBaseTestingUtility();<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Rule<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public TestName name = new TestName();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @BeforeClass public static void before() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    TESTING_UTIL.getConfiguration().setInt(HConstants.HBASE_BALANCER_PERIOD, 60000);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    TESTING_UTIL.startMiniCluster(1, NB_SERVERS, null, MyMaster.class, null);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @AfterClass public static void after() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    TESTING_UTIL.shutdownMiniCluster();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Before public void setup() throws IOException {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    TESTING_UTIL.ensureSomeNonStoppedRegionServersAvailable(NB_SERVERS);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.admin = TESTING_UTIL.getAdmin();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.cluster = TESTING_UTIL.getMiniHBaseCluster();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @After<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public void tearDown() throws Exception {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    this.admin.close();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    for (HTableDescriptor htd: this.admin.listTables()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      LOG.info("Tear down, remove table=" + htd.getTableName());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      TESTING_UTIL.deleteTable(htd.getTableName());<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private RegionInfo getAndCheckSingleTableRegion(final List&lt;HRegion&gt; regions)<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      throws IOException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertEquals(1, regions.size());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    RegionInfo hri = regions.get(0).getRegionInfo();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    try {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      cluster.getMaster().getAssignmentManager().waitForAssignment(hri, 600000);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    } catch (NoSuchProcedureException e) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.info("Presume the procedure has been cleaned up so just proceed: " + e.toString());<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return hri;<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>  private void requestSplitRegion(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      final HRegionServer rsServer,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      final Region region,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      final byte[] midKey) throws IOException {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    long procId = cluster.getMaster().splitRegion(region.getRegionInfo(), midKey, 0, 0);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    // wait for the split to complete or get interrupted.  If the split completes successfully,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // the procedure will return true; if the split fails, the procedure would throw exception.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    ProcedureTestingUtility.waitProcedure(cluster.getMaster().getMasterProcedureExecutor(), procId);<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>  @Test<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  public void testRITStateForRollback() throws Exception {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    final HMaster master = cluster.getMaster();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    try {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      // Create table then get the single region for our new table.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      Table t = createTableAndWait(tableName, Bytes.toBytes("cf"));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      final List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      final RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      insertData(tableName, admin, t);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      t.close();<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>      // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      this.admin.setBalancerRunning(false, true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // Turn off the meta scanner so it don't remove parent on us.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      master.setCatalogJanitorEnabled(false);<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // find a splittable region<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      final HRegion region = findSplittableRegion(regions);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      assertTrue("not able to find a splittable region", region != null);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>      // install master co-processor to fail splits<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      master.getMasterCoprocessorHost().load(<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        FailingSplitMasterObserver.class,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        Coprocessor.PRIORITY_USER,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        master.getConfiguration());<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // split async<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      this.admin.splitRegion(region.getRegionInfo().getRegionName(), new byte[] {42});<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>      // we have to wait until the SPLITTING state is seen by the master<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FailingSplitMasterObserver observer =<a name="line.213"></a>
+<span class="sourceLineNo">214</span>          master.getMasterCoprocessorHost().findCoprocessor(FailingSplitMasterObserver.class);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      assertNotNull(observer);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      observer.latch.await();<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>      LOG.info("Waiting for region to come out of RIT");<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      while (!cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        Threads.sleep(100);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    } finally {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      admin.setBalancerRunning(true, false);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      master.setCatalogJanitorEnabled(true);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      abortAndWaitForMaster();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      TESTING_UTIL.deleteTable(tableName);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  @Test<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  public void testSplitFailedCompactionAndSplit() throws Exception {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // Create table then get the single region for our new table.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    byte[] cf = Bytes.toBytes("cf");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    htd.addFamily(new HColumnDescriptor(cf));<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    admin.createTable(htd);<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    for (int i = 0; cluster.getRegions(tableName).isEmpty() &amp;&amp; i &lt; 100; i++) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      Thread.sleep(100);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    assertEquals(1, cluster.getRegions(tableName).size());<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    HRegion region = cluster.getRegions(tableName).get(0);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    HStore store = region.getStore(cf);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    int regionServerIndex = cluster.getServerWith(region.getRegionInfo().getRegionName());<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Table t = TESTING_UTIL.getConnection().getTable(tableName);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // insert data<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    insertData(tableName, admin, t);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    insertData(tableName, admin, t);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    int fileNum = store.getStorefiles().size();<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // 0, Compaction Request<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    store.triggerMajorCompaction();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    Optional&lt;CompactionContext&gt; cc = store.requestCompaction();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    assertTrue(cc.isPresent());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // 1, A timeout split<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // 1.1 close region<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assertEquals(2, region.close(false).get(cf).size());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // 1.2 rollback and Region initialize again<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    region.initialize();<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    // 2, Run Compaction cc<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    assertFalse(region.compact(cc.get(), store, NoLimitThroughputController.INSTANCE));<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertTrue(fileNum &gt; store.getStorefiles().size());<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // 3, Split<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    requestSplitRegion(regionServer, region, Bytes.toBytes("row3"));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    assertEquals(2, cluster.getRegions(tableName).size());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public static class FailingSplitMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    volatile CountDownLatch latch;<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>    @Override<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      latch = new CountDownLatch(1);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return Optional.of(this);<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>    @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    public void preSplitRegionBeforeMETAAction(<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        final byte[] splitKey,<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        final List&lt;Mutation&gt; metaEntries) throws IOException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      latch.countDown();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      throw new IOException("Causing rollback of region split");<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  public void testSplitRollbackOnRegionClosing() throws IOException, InterruptedException {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // Create table then get the single region for our new table.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.305"></a>
 <span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.307"></a>
+<span class="sourceLineNo">307</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.307"></a>
 <span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.admin.setBalancerRunning(false, true);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // Add a bit of load up into the table so splittable.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Get region pre-split.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      printOutRegions(server, "Initial regions: ");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // rollback.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // split transaction. Catch the exception instead.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      try {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        fail();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      } catch (DoNotRetryRegionException e) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        // Expected<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Wait around a while and assert count of regions remains constant.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        Thread.sleep(100);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // Now try splitting and it should work.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      split(hri, server, regionCount);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      // Get daughters<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      checkAndGetDaughters(tableName);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      // OK, so split happened after we cleared the blocking node.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    } finally {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      admin.setBalancerRunning(true, false);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      t.close();<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><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @throws IOException<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @throws InterruptedException<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  @Test<a name="line.356"></a>
-<span class="sourceLineNo">357</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Create table then get the single region for our new table.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.365"></a>
+<span class="sourceLineNo">309</span>    RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    this.admin.setBalancerRunning(false, true);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Add a bit of load up into the table so splittable.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // Get region pre-split.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      printOutRegions(server, "Initial regions: ");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      regionStates.updateRegionState(hri, RegionState.State.CLOSING);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // Now try splitting.... should fail.  And each should successfully<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // rollback.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      // We don't roll back here anymore. Instead we fail-fast on construction of the<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      // split transaction. Catch the exception instead.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.admin.splitRegion(hri.getRegionName());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        fail();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      } catch (DoNotRetryRegionException e) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        // Expected<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // Wait around a while and assert count of regions remains constant.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        Thread.sleep(100);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        assertEquals(regionCount, cluster.getRegions(hri.getTable()).size());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      regionStates.updateRegionState(hri, State.OPEN);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      // Now try splitting and it should work.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      split(hri, server, regionCount);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      // Get daughters<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      checkAndGetDaughters(tableName);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      // OK, so split happened after we cleared the blocking node.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    } finally {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      admin.setBalancerRunning(true, false);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      t.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<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>   * Test that if daughter split on us, we won't do the shutdown handler fixup<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * just because we can't find the immediate daughter of an offlined parent.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @throws IOException<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @throws InterruptedException<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  @Test<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  public void testShutdownFixupWhenDaughterHasSplit()throws IOException, InterruptedException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // Create table then get the single region for our new table.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.365"></a>
 <span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    this.admin.setBalancerRunning(false, true);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    try {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      // Add a bit of load up into the table so splittable.<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Get region pre-split.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      printOutRegions(server, "Initial regions: ");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      int regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      // Now split.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      split(hri, server, regionCount);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      // Get daughters<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // Now split one of the daughters.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      regionCount = cluster.getRegions(hri.getTable()).size();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      RegionInfo daughter = daughters.get(0).getRegionInfo();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.info("Daughter we are going to split: " + daughter);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Compact first to ensure we have cleaned up references -- else the split<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // will fail.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      this.admin.compactRegion(daughter.getRegionName());<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      daughters = cluster.getRegions(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      HRegion daughterRegion = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      for (HRegion r: daughters) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        if (RegionInfo.COMPARATOR.compare(r.getRegionInfo(), daughter) == 0) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          daughterRegion = r;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          LOG.info("Found matching HRI: " + daughterRegion);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          break;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      assertTrue(daughterRegion != null);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      for (int i=0; i&lt;100; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        if (!daughterRegion.hasReferences()) break;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Threads.sleep(100);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      assertFalse("Waiting for reference to be compacted", daughterRegion.hasReferences());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      LOG.info("Daughter hri before split (has been compacted): " + daughter);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      split(daughter, server, regionCount);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // Get list of daughters<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      daughters = cluster.getRegions(tableName);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      for (HRegion d: daughters) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        LOG.info("Regions before crash: " + d);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Now crash the server<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      cluster.abortRegionServer(tableRegionIndex);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      waitUntilRegionServerDead();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      awaitDaughters(tableName, daughters.size());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      // Assert daughters are online and ONLY the original daughters -- that<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      // fixup didn't insert one during server shutdown recover.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      regions = cluster.getRegions(tableName);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      for (HRegion d: daughters) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        LOG.info("Regions after crash: " + d);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (daughters.size() != regions.size()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        LOG.info("Daughters=" + daughters.size() + ", regions=" + regions.size());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      assertEquals(daughters.size(), regions.size());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      for (HRegion r: regions) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        LOG.info("Regions post crash " + r + ", contains=" + daughters.contains(r));<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        assertTrue("Missing region post crash " + r, daughters.contains(r));<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      LOG.info("EXITING");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      admin.setBalancerRunning(true, false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      t.close();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @Test<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void testSplitShouldNotThrowNPEEvenARegionHasEmptySplitFiles() throws Exception {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    TableName userTableName = TableName.valueOf(name.getMethodName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    HTableDescriptor htd = new HTableDescriptor(userTableName);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    HColumnDescriptor hcd = new HColumnDescriptor("col");<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    htd.addFamily(hcd);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    admin.createTable(htd);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    Table table = TESTING_UTIL.getConnection().getTable(userTableName);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      for (int i = 0; i &lt;= 5; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        String row = "row" + i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Put p = new Put(row.getBytes());<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        String val = "Val" + i;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        p.addColumn("col".getBytes(), "ql".getBytes(), val.getBytes());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        table.put(p);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        admin.flush(userTableName);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        Delete d = new Delete(row.getBytes());<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        // Do a normal delete<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        table.delete(d);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        admin.flush(userTableName);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      admin.majorCompact(userTableName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      List&lt;RegionInfo&gt; regionsOfTable =<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          cluster.getMaster().getAssignmentManager().getRegionStates()<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          .getRegionsOfTable(userTableName);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(1, regionsOfTable.size());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      RegionInfo hRegionInfo = regionsOfTable.get(0);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      Put p = new Put("row6".getBytes());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      table.put(p);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      p = new Put("row7".getBytes());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      table.put(p);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      p = new Put("row8".getBytes());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      p.addColumn("col".getBytes(), "ql".getBytes(), "val".getBytes());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      table.put(p);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      admin.flush(userTableName);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      admin.splitRegion(hRegionInfo.getRegionName(), "row7".getBytes());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      regionsOfTable = cluster.getMaster()<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          .getAssignmentManager().getRegionStates()<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .getRegionsOfTable(userTableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      while (regionsOfTable.size() != 2) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        Thread.sleep(1000);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        regionsOfTable = cluster.getMaster()<a name="line.481"></a>
-<span class="sourceLineNo">482</span>            .getAssignmentManager().getRegionStates()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>            .getRegionsOfTable(userTableName);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.debug("waiting 2 regions to be available, got " + regionsOfTable.size() +<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          ": " + regionsOfTable);<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>      }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      Assert.assertEquals(2, regionsOfTable.size());<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      Scan s = new Scan();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      ResultScanner scanner = table.getScanner(s);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      int mainTableCount = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        mainTableCount++;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      Assert.assertEquals(3, mainTableCount);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    } finally {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      table.close();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * Verifies HBASE-5806.  Here the case is that splitting is completed but before the<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * CJ could remove the parent region the master is killed and restarted.<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @throws IOException<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   * @throws InterruptedException<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @throws NodeExistsException<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @throws KeeperException<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  @Test<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  public void testMasterRestartAtRegionSplitPendingCatalogJanitor()<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      throws IOException, InterruptedException, NodeExistsException,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      KeeperException, ServiceException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    // Create table then get the single region for our new table.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    Table t = createTableAndWait(tableName, HConstants.CATALOG_FAMILY);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    List&lt;HRegion&gt; regions = cluster.getRegions(tableName);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    RegionInfo hri = getAndCheckSingleTableRegion(regions);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>    int tableRegionIndex = ensureTableRegionNotOnSameServerAsMeta(admin, hri);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    // Turn off balancer so it doesn't cut in and mess up our placements.<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    this.admin.setBalancerRunning(false, true);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // Turn off the meta scanner so it don't remove parent on us.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    cluster.getMaster().setCatalogJanitorEnabled(false);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Add a bit of load up into the table so splittable.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      TESTING_UTIL.loadTable(t, HConstants.CATALOG_FAMILY, false);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      // Get region pre-split.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      HRegionServer server = cluster.getRegionServer(tableRegionIndex);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      printOutRegions(server, "Initial regions: ");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Call split.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      this.admin.splitRegion(hri.getRegionName());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      List&lt;HRegion&gt; daughters = checkAndGetDaughters(tableName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // Before cleanup, get a new master.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      HMaster master = abortAndWaitForMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      // Now call compact on the daughters and clean up any references.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      for (HRegion daughter: daughters) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        daughter.compact(true);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        assertFalse(daughter.hasReferences());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      // BUT calling compact on the daughters is not enough. The CatalogJanitor looks<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      // in the filesystem, and the filesystem content is not same as what the Region<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      // is reading from. Compacted-away files are picked up later by the compacted<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      // file discharger process. It runs infrequently. Make it run so CatalogJanitor<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      // doens't find any references.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      for (RegionServerThread rst: cluster.getRegionServerThreads()) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>        boolean oldSetting = rst.getRegionServer().compactedFileDischarger.setUseExecutor(false);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        rst.getRegionServer().compactedFileDischarger.run();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        rst.getRegionServer().compactedFileDischarger.setUseExecutor(oldSetting);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      cluster.getMaster().setCatalogJanitorEnabled(true);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      LOG.info("Starting run of CatalogJanitor");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      cluster.getMaster().getCatalogJanitor().run();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      ProcedureTestingUtility.waitAllProcedures(cluster.getMaster().getMasterProcedureExecutor());<a name="line.556"></a>
-<span class="sou

<TRUNCATED>

[16/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
index c658da2..3c4d549 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CPRegionServerObserver.html
@@ -56,710 +56,730 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.TableName;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.Waiter;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.zookeeper.KeeperException;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.junit.After;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.junit.AfterClass;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.junit.BeforeClass;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.junit.ClassRule;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.junit.Test;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.junit.experimental.categories.Category;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.slf4j.Logger;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.slf4j.LoggerFactory;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>@Category(MediumTests.class)<a name="line.95"></a>
-<span class="sourceLineNo">096</span>public class TestNamespaceAuditor {<a name="line.96"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.CompactionState;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.DoNotRetryRegionException;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.coprocessor.MasterObserver;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.coprocessor.RegionObserver;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.coprocessor.RegionServerObserver;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.master.TableNamespaceManager;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.quotas.QuotaExceededException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.zookeeper.KeeperException;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.After;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.AfterClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.BeforeClass;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.ClassRule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.slf4j.Logger;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.slf4j.LoggerFactory;<a name="line.96"></a>
 <span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @ClassRule<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static Admin ADMIN;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private String prefix = "TestNamespaceAuditor";<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @BeforeClass<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static void before() throws Exception {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    Configuration conf = UTIL.getConfiguration();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    conf.setStrings(<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      RegionServerObserver.class);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    UTIL.startMiniCluster(1, 1);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    waitForQuotaInitialize(UTIL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static void tearDown() throws Exception {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    UTIL.shutdownMiniCluster();<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>  @After<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void cleanup() throws Exception, KeeperException {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      ADMIN.disableTable(table.getTableName());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      deleteTable(table.getTableName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (ns.getName().startsWith(prefix)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        ADMIN.deleteNamespace(ns.getName());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public void testTableOperations() throws Exception {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    String nsp = prefix + "_np2";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    NamespaceDescriptor nspDesc =<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.147"></a>
-<span class="sourceLineNo">148</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ADMIN.createNamespace(nspDesc);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    HTableDescriptor tableDescOne =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    tableDescOne.addFamily(fam1);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    HTableDescriptor tableDescTwo =<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    tableDescTwo.addFamily(fam1);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    HTableDescriptor tableDescThree =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    tableDescThree.addFamily(fam1);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    ADMIN.createTable(tableDescOne);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    boolean constraintViolated = false;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    } catch (Exception exp) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      assertTrue(exp instanceof IOException);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      constraintViolated = true;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } finally {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        constraintViolated);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertNotNull(nspState);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    constraintViolated = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    try {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      ADMIN.createTable(tableDescThree);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } catch (Exception exp) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertTrue(exp instanceof IOException);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      constraintViolated = true;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        constraintViolated);<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><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @Test<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  public void testValidQuotas() throws Exception {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    boolean exceptionCaught = false;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    NamespaceDescriptor nspDesc =<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.198"></a>
-<span class="sourceLineNo">199</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      ADMIN.createNamespace(nspDesc);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } catch (Exception exp) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      LOG.warn(exp.toString(), exp);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      exceptionCaught = true;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    } finally {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      assertTrue(exceptionCaught);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    nspDesc =<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.211"></a>
-<span class="sourceLineNo">212</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      ADMIN.createNamespace(nspDesc);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    } catch (Exception exp) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      LOG.warn(exp.toString(), exp);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      exceptionCaught = true;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    } finally {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      assertTrue(exceptionCaught);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    nspDesc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      ADMIN.createNamespace(nspDesc);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    } catch (Exception exp) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      LOG.warn(exp.toString(), exp);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      exceptionCaught = true;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    } finally {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      assertTrue(exceptionCaught);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    nspDesc =<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      ADMIN.createNamespace(nspDesc);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    } catch (Exception exp) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      LOG.warn(exp.toString(), exp);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      exceptionCaught = true;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } finally {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      assertTrue(exceptionCaught);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<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><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  public void testDeleteTable() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    String namespace = prefix + "_dummy";<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    NamespaceDescriptor nspDesc =<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        NamespaceDescriptor.create(namespace)<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    ADMIN.createNamespace(nspDesc);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HTableDescriptor tableDescOne =<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    tableDescOne.addFamily(fam1);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HTableDescriptor tableDescTwo =<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    tableDescTwo.addFamily(fam1);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    ADMIN.createTable(tableDescOne);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    deleteTable(tableDescOne.getTableName());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    deleteTable(tableDescTwo.getTableName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    ADMIN.deleteNamespace(namespace);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    stateInfo = getNamespaceState(namespace);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    assertNull("Namespace state not found to be null.", stateInfo);<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 static class CPRegionServerObserver<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private volatile boolean shouldFailMerge = false;<a name="line.290"></a>
-<span class="sourceLineNo">291</span><a name="line.291"></a>
-<span class="sourceLineNo">292</span>    public void failMerge(boolean fail) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      shouldFailMerge = fail;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>    private boolean triggered = false;<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      while (!triggered) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        wait();<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><a name="line.303"></a>
-<span class="sourceLineNo">304</span>    @Override<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return Optional.of(this);<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><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private volatile boolean shouldFailMerge = false;<a name="line.311"></a>
+<span class="sourceLineNo">098</span>@Category(MediumTests.class)<a name="line.98"></a>
+<span class="sourceLineNo">099</span>public class TestNamespaceAuditor {<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @ClassRule<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      HBaseClassTestRule.forClass(TestNamespaceAuditor.class);<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(TestNamespaceAuditor.class);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private static Admin ADMIN;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private String prefix = "TestNamespaceAuditor";<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @BeforeClass<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static void before() throws Exception {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Configuration conf = UTIL.getConfiguration();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, CustomObserver.class.getName());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    conf.setStrings(<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      MasterSyncObserver.class.getName(), CPMasterObserver.class.getName());<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    conf.setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    conf.setClass("hbase.coprocessor.regionserver.classes", CPRegionServerObserver.class,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      RegionServerObserver.class);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    UTIL.startMiniCluster(1, 1);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    waitForQuotaInitialize(UTIL);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    ADMIN = UTIL.getAdmin();<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>  @AfterClass<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static void tearDown() throws Exception {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    UTIL.shutdownMiniCluster();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @After<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public void cleanup() throws Exception, KeeperException {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (HTableDescriptor table : ADMIN.listTables()) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      ADMIN.disableTable(table.getTableName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      deleteTable(table.getTableName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    for (NamespaceDescriptor ns : ADMIN.listNamespaceDescriptors()) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if (ns.getName().startsWith(prefix)) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        ADMIN.deleteNamespace(ns.getName());<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>    assertTrue("Quota manager not initialized", UTIL.getHBaseCluster().getMaster()<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        .getMasterQuotaManager().isQuotaInitialized());<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>  @Test<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void testTableOperations() throws Exception {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    String nsp = prefix + "_np2";<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    NamespaceDescriptor nspDesc =<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    ADMIN.createNamespace(nspDesc);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(nsp));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    assertEquals(3, ADMIN.listNamespaceDescriptors().length);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>    HTableDescriptor tableDescOne =<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    tableDescOne.addFamily(fam1);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    HTableDescriptor tableDescTwo =<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    tableDescTwo.addFamily(fam1);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    HTableDescriptor tableDescThree =<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table3"));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    tableDescThree.addFamily(fam1);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    ADMIN.createTable(tableDescOne);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    boolean constraintViolated = false;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    try {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    } catch (Exception exp) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      assertTrue(exp instanceof IOException);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      constraintViolated = true;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    } finally {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        constraintViolated);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 4);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    NamespaceTableAndRegionInfo nspState = getQuotaManager().getState(nsp);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    assertNotNull(nspState);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    assertTrue(nspState.getTables().size() == 2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertTrue(nspState.getRegionCount() == 5);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    constraintViolated = false;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    try {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      ADMIN.createTable(tableDescThree);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    } catch (Exception exp) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      assertTrue(exp instanceof IOException);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      constraintViolated = true;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      assertTrue("Constraint not violated for table " + tableDescThree.getTableName(),<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        constraintViolated);<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><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @Test<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void testValidQuotas() throws Exception {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    boolean exceptionCaught = false;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    NamespaceDescriptor nspDesc =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        NamespaceDescriptor.create(prefix + "vq1")<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "hihdufh")<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    try {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      ADMIN.createNamespace(nspDesc);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception exp) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      LOG.warn(exp.toString(), exp);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      exceptionCaught = true;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } finally {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      assertTrue(exceptionCaught);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    nspDesc =<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        NamespaceDescriptor.create(prefix + "vq2")<a name="line.213"></a>
+<span class="sourceLineNo">214</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "-456")<a name="line.214"></a>
+<span class="sourceLineNo">215</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    try {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      ADMIN.createNamespace(nspDesc);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    } catch (Exception exp) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      LOG.warn(exp.toString(), exp);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      exceptionCaught = true;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } finally {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertTrue(exceptionCaught);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    nspDesc =<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        NamespaceDescriptor.create(prefix + "vq3")<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "sciigd").build();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      ADMIN.createNamespace(nspDesc);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    } catch (Exception exp) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      LOG.warn(exp.toString(), exp);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      exceptionCaught = true;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    } finally {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertTrue(exceptionCaught);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    nspDesc =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        NamespaceDescriptor.create(prefix + "vq4")<a name="line.239"></a>
+<span class="sourceLineNo">240</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "10")<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "-1500").build();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    try {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      ADMIN.createNamespace(nspDesc);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } catch (Exception exp) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      LOG.warn(exp.toString(), exp);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      exceptionCaught = true;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    } finally {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      assertTrue(exceptionCaught);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      assertFalse(fs.exists(FSUtils.getNamespaceDir(rootDir, nspDesc.getName())));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Test<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void testDeleteTable() throws Exception {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    String namespace = prefix + "_dummy";<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    NamespaceDescriptor nspDesc =<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        NamespaceDescriptor.create(namespace)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "100")<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "3").build();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    ADMIN.createNamespace(nspDesc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    assertNotNull("Namespace descriptor found null.", ADMIN.getNamespaceDescriptor(namespace));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    NamespaceTableAndRegionInfo stateInfo = getNamespaceState(nspDesc.getName());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    assertNotNull("Namespace state found null for " + namespace, stateInfo);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    HTableDescriptor tableDescOne =<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table1"));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    tableDescOne.addFamily(fam1);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    HTableDescriptor tableDescTwo =<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        new HTableDescriptor(TableName.valueOf(namespace + TableName.NAMESPACE_DELIM + "table2"));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    tableDescTwo.addFamily(fam1);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    ADMIN.createTable(tableDescOne);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"), 5);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    assertEquals(2, stateInfo.getTables().size());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    assertEquals(5, stateInfo.getRegionCountOfTable(tableDescTwo.getTableName()));<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertEquals(6, stateInfo.getRegionCount());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    ADMIN.disableTable(tableDescOne.getTableName());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    deleteTable(tableDescOne.getTableName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    stateInfo = getNamespaceState(nspDesc.getName());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertNotNull("Namespace state found to be null.", stateInfo);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    assertEquals(5, stateInfo.getRegionCount());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(1, stateInfo.getTables().size());<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    ADMIN.disableTable(tableDescTwo.getTableName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    deleteTable(tableDescTwo.getTableName());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    ADMIN.deleteNamespace(namespace);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    stateInfo = getNamespaceState(namespace);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    assertNull("Namespace state not found to be null.", stateInfo);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  public static class CPRegionServerObserver<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      implements RegionServerCoprocessor, RegionServerObserver {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    private volatile boolean shouldFailMerge = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    public void failMerge(boolean fail) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      shouldFailMerge = fail;<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>    private boolean triggered = false;<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    public synchronized void waitUtilTriggered() throws InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      while (!triggered) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        wait();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    @Override<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return Optional.of(this);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    public void failMerge(boolean fail) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      shouldFailMerge = fail;<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>    @Override<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      return Optional.of(this);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    @Override<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    public synchronized void preMergeRegionsAction(<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      notifyAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (shouldFailMerge) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new IOException("fail merge");<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  @Test<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  public void testRegionMerge() throws Exception {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    String nsp1 = prefix + "_regiontest";<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    final int initialRegions = 3;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    NamespaceDescriptor nspDesc =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        NamespaceDescriptor.create(nsp1)<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    ADMIN.createNamespace(nspDesc);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    ADMIN.flush(tableTwo);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    assertEquals(initialRegions, hris.size());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      false);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    f.get(10, TimeUnit.SECONDS);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    regionToSplit.compact(true);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    // wait a while to let the ongoing compaction finish.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    UTIL.waitFor(10000, regionToSplit::isSplittable);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    ADMIN.splitRegionAsync(regionToSplit.getRegionInfo().getRegionName(), splitKey).get(10,<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      TimeUnit.SECONDS);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(initialRegions, hris.size());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // Fail region merge through Coprocessor hook<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    MiniHBaseCluster cluster = UTIL.getHBaseCluster();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    MasterCoprocessorHost cpHost = cluster.getMaster().getMasterCoprocessorHost();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Coprocessor coprocessor = cpHost.findCoprocessor(CPMasterObserver.class);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    CPMasterObserver masterObserver = (CPMasterObserver) coprocessor;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    masterObserver.failMerge(true);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    f = ADMIN.mergeRegionsAsync(<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      hris.get(2).getEncodedNameAsBytes(),<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      false);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    try {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      f.get(10, TimeUnit.SECONDS);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      fail("Merge was supposed to fail!");<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    } catch (ExecutionException ee) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      // Expected.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(initialRegions, hris.size());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // verify that we cannot split<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    try {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ADMIN.split(tableTwo, Bytes.toBytes("6"));<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      fail();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    } catch (DoNotRetryRegionException e) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      // Expected<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    Thread.sleep(2000);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    assertEquals(initialRegions, ADMIN.getRegions(tableTwo).size());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  /*<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   * Create a table and make sure that the table creation fails after adding this table entry into<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * namespace quota cache. Now correct the failure and recreate the table with same name.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * HBASE-13394<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   */<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  @Test<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public void testRecreateTableWithSameNameAfterFirstTimeFailure() throws Exception {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    String nsp1 = prefix + "_testRecreateTable";<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    NamespaceDescriptor nspDesc =<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        NamespaceDescriptor.create(nsp1)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "1").build();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    ADMIN.createNamespace(nspDesc);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    final TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    MasterSyncObserver.throwExceptionInPreCreateTableAction = true;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        ADMIN.createTable(tableDescOne);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        fail("Table " + tableOne.toString() + "creation should fail.");<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      } catch (Exception exp) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        LOG.error(exp.toString(), exp);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      assertFalse(ADMIN.tableExists(tableOne));<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>      NamespaceTableAndRegionInfo nstate = getNamespaceState(nsp1);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      assertEquals("First table creation failed in namespace so number of tables in namespace "<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          + "should be 0.", 0, nstate.getTables().size());<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      try {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        ADMIN.createTable(tableDescOne);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      } catch (Exception e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        fail("Table " + tableOne.toString() + "creation should succeed.");<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        LOG.error(e.toString(), e);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertTrue(ADMIN.tableExists(tableOne));<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      nstate = getNamespaceState(nsp1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      assertEquals("First table was created successfully so table size in namespace should "<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          + "be one now.", 1, nstate.getTables().size());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    } finally {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      MasterSyncObserver.throwExceptionInPreCreateTableAction = false;<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      if (ADMIN.tableExists(tableOne)) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        ADMIN.disableTable(tableOne);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        deleteTable(tableOne);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      ADMIN.deleteNamespace(nsp1);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    }<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>  private NamespaceTableAndRegionInfo getNamespaceState(String namespace) throws KeeperException,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getQuotaManager().getState(namespace);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  byte[] getSplitKey(byte[] startKey, byte[] endKey) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    String skey = Bytes.toString(startKey);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    int key;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    if (StringUtils.isBlank(skey)) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      key = Integer.parseInt(Bytes.toString(endKey))/2 ;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    } else {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      key = (int) (Integer.parseInt(skey) * 1.5);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    return Bytes.toBytes("" + key);<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>  public static class CustomObserver implements RegionCoprocessor, RegionObserver {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    volatile CountDownLatch postCompact;<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        throws IOException {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      postCompact.countDown();<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    public void start(CoprocessorEnvironment e) throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      postCompact = new CountDownLatch(1);<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>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return Optional.of(this);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Test<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public void testStatePreserve() throws Exception {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    final String nsp1 = prefix + "_testStatePreserve";<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    NamespaceDescriptor nspDesc = NamespaceDescriptor.create(nsp1)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "20")<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "10").build();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    ADMIN.createNamespace(nspDesc);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    TableName tableOne = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table1");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    TableName tableThree = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table3");<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    HColumnDescriptor fam1 = new HColumnDescriptor("fam1");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableOne);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    tableDescOne.addFamily(fam1);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    HTableDescriptor tableDescTwo = new HTableDescriptor(tableTwo);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    tableDescTwo.addFamily(fam1);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    HTableDescriptor tableDescThree = new HTableDescriptor(tableThree);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    tableDescThree.addFamily(fam1);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    ADMIN.createTable(tableDescTwo, Bytes.toBytes("1"), Bytes.toBytes("1000"), 3);<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    ADMIN.createTable(tableDescThree, Bytes.toBytes("1"), Bytes.toBytes("1000"), 4);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    ADMIN.disableTable(tableThree);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    deleteTable(tableThree);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    // wait for chore to complete<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    UTIL.waitFor(1000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      @Override<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      public boolean evaluate() throws Exception {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>       return (getNamespaceState(nsp1).getTables().size() == 2);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    });<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    NamespaceTableAndRegionInfo before = getNamespaceState(nsp1);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    restartMaster();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    NamespaceTableAndRegionInfo after = getNamespaceState(nsp1);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    assertEquals("Expected: " + before.getTables() + " Found: " + after.getTables(), before<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        .getTables().size(), after.getTables().size());<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void waitForQuotaInitialize(final HBaseTestingUtility util) throws Exception {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    util.waitFor(60000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      public boolean evaluate() throws Exception {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        HMaster master = util.getHBaseCluster().getMaster();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        if (master == null) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          return false;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        MasterQuotaManager quotaManager = master.getMasterQuotaManager();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        return quotaManager != null &amp;&amp; quotaManager.isQuotaInitialized();<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>  }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  private void restartMaster() throws Exception {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    UTIL.getHBaseCluster().getMaster(0).stop("Stopping to start again");<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    UTIL.getHBaseCluster().waitOnMaster(0);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    UTIL.getHBaseCluster().startMaster();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    waitForQuotaInitialize(UTIL);<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>  private NamespaceAuditor getQuotaManager() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return UTIL.getHBaseCluster().getMaster()<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        .getMasterQuotaManager().getNamespaceQuotaManager();<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>  public static class MasterSyncObserver implements MasterCoprocessor, MasterObserver {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    volatile CountDownLatch tableDeletionLatch;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    static boolean throwExceptionInPreCreateTableAction;<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      return Optional.of(this);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>    @Override<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    public void preDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        TableName tableName) throws IOException {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      tableDeletionLatch = new CountDownLatch(1);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
+<span class="sourceLineNo">313</span>  public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private volatile boolean shouldFailMerge = false;<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public void failMerge(boolean fail) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      shouldFailMerge = fail;<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>    @Override<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      return Optional.of(this);<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>    @Override<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    public synchronized void preMergeRegionsAction(<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        final RegionInfo[] regionsToMerge) throws IOException {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      notifyAll();<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (shouldFailMerge) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        throw new IOException("fail merge");<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>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  @Test<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public void testRegionMerge() throws Exception {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    String nsp1 = prefix + "_regiontest";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    final int initialRegions = 3;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    NamespaceDescriptor nspDesc =<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        NamespaceDescriptor.create(nsp1)<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "" + initialRegions)<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            .addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ADMIN.createNamespace(nspDesc);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    final TableName tableTwo = TableName.valueOf(nsp1 + TableName.NAMESPACE_DELIM + "table2");<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    byte[] columnFamily = Bytes.toBytes("info");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    HTableDescriptor tableDescOne = new HTableDescriptor(tableTwo);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    tableDescOne.addFamily(new HColumnDescriptor(columnFamily));<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    ADMIN.createTable(tableDescOne, Bytes.toBytes("0"), Bytes.toBytes("9"), initialRegions);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    Connection connection = ConnectionFactory.createConnection(UTIL.getConfiguration());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    try (Table table = connection.getTable(tableTwo)) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      UTIL.loadNumericRows(table, Bytes.toBytes("info"), 1000, 1999);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    ADMIN.flush(tableTwo);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    List&lt;RegionInfo&gt; hris = ADMIN.getRegions(tableTwo);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    assertEquals(initialRegions, hris.size());<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    Future&lt;?&gt; f = ADMIN.mergeRegionsAsync(<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      hris.get(0).getEncodedNameAsBytes(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      hris.get(1).getEncodedNameAsBytes(),<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      false);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    f.get(10, TimeUnit.SECONDS);<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    hris = ADMIN.getRegions(tableTwo);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    assertEquals(initialRegions - 1, hris.size());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    byte[] splitKey = Bytes.toBytes("3");<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    HRegion regionToSplit = UTIL.getMiniHBaseCluster().getRegions(tableTwo).stream()<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      .filter(r -&gt; r.getRegionInfo().containsRow(splitKey)).findFirst().get();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    regionToSplit.compact(true);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    // Waiting for compaction to finish<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    UTIL.waitFor(30000, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      @Override<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      public boolean evaluate() throws Exception {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        return (CompactionState.NONE == ADMIN<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            .getCompactionStateForRegion(regionToSplit.getRegionInfo().getRegionName()));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    });<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // Cleaning compacted references for split to proceed<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    regionToSplit.getStores().stream().forEach(s -&gt; {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      try {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        s.closeAndArchiveCompactedFiles();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      } catch (IOException e1) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        LOG.error("Error whiling cleaning compacted file");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    });<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    // the above compact may quit immediately if there is a compaction ongoing, so here we need to<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    // wait a while to let the ongoing compaction finish.<a name="line.389"></a>
+

<TRUNCATED>

[08/41] hbase-site git commit: Published site at d159b1f8bb9a29f7786a96c910157e12583768a2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/7cafc412/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
index 7c754a9..8f7596e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHStoreFile.html
@@ -39,15 +39,15 @@
 <span class="sourceLineNo">031</span>import java.util.OptionalLong;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.TreeSet;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></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.FileSystem;<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.Cell;<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.HBaseClassTestRule;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseTestCase;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.42"></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.FileSystem;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseTestCase;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
 <span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.44"></a>
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.45"></a>
@@ -56,1065 +56,1095 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.TableName;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.io.HFileLink;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.io.hfile.CacheStats;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoderImpl;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.io.hfile.HFileScanner;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.util.BloomFilterFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.ChecksumType;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.junit.After;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.junit.Before;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.junit.ClassRule;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.Test;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.experimental.categories.Category;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.mockito.Mockito;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.slf4j.Logger;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.slf4j.LoggerFactory;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hbase.thirdparty.com.google.common.base.Joiner;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterables;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>/**<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * Test HStoreFile<a name="line.82"></a>
-<span class="sourceLineNo">083</span> */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>@Category({RegionServerTests.class, SmallTests.class})<a name="line.84"></a>
-<span class="sourceLineNo">085</span>public class TestHStoreFile extends HBaseTestCase {<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  @ClassRule<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      HBaseClassTestRule.forClass(TestHStoreFile.class);<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private static final Logger LOG = LoggerFactory.getLogger(TestHStoreFile.class);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private CacheConfig cacheConf =  new CacheConfig(TEST_UTIL.getConfiguration());<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static String ROOT_DIR = TEST_UTIL.getDataTestDir("TestStoreFile").toString();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static final ChecksumType CKTYPE = ChecksumType.CRC32C;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static final int CKBYTES = 512;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private static String TEST_FAMILY = "cf";<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  @Before<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  public void setUp() throws Exception {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    super.setUp();<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>  @Override<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  @After<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public void tearDown() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    super.tearDown();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  /**<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * Write a file and then assert that we can read from top and bottom halves<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * using two HalfMapFiles.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * @throws Exception<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   */<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  @Test<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  public void testBasicHalfMapFile() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    final HRegionInfo hri =<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        new HRegionInfo(TableName.valueOf("testBasicHalfMapFileTb"));<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      conf, fs, new Path(testDir, hri.getTable().getNameAsString()), hri);<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(2*1024).build();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, this.fs)<a name="line.124"></a>
-<span class="sourceLineNo">125</span>            .withFilePath(regionFs.createTempName())<a name="line.125"></a>
-<span class="sourceLineNo">126</span>            .withFileContext(meta)<a name="line.126"></a>
-<span class="sourceLineNo">127</span>            .build();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    writeStoreFile(writer);<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    Path sfPath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    HStoreFile sf = new HStoreFile(this.fs, sfPath, conf, cacheConf, BloomType.NONE, true);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    checkHalfHFile(regionFs, sf);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private void writeStoreFile(final StoreFileWriter writer) throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    writeStoreFile(writer, Bytes.toBytes(getName()), Bytes.toBytes(getName()));<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  // pick an split point (roughly halfway)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  byte[] SPLITKEY = new byte[] { (LAST_CHAR + FIRST_CHAR)/2, FIRST_CHAR};<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>   * Writes HStoreKey and ImmutableBytes data to passed writer and<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * then closes it.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * @param writer<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * @throws IOException<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static void writeStoreFile(final StoreFileWriter writer, byte[] fam, byte[] qualifier)<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  throws IOException {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    long now = System.currentTimeMillis();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    try {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      for (char d = FIRST_CHAR; d &lt;= LAST_CHAR; d++) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        for (char e = FIRST_CHAR; e &lt;= LAST_CHAR; e++) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          byte[] b = new byte[] { (byte) d, (byte) e };<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          writer.append(new KeyValue(b, fam, qualifier, now, b));<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>    } finally {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      writer.close();<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>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Test that our mechanism of writing store files in one region to reference<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * store files in other regions works.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @throws IOException<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   */<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public void testReference() throws IOException {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    final HRegionInfo hri = new HRegionInfo(TableName.valueOf("testReferenceTb"));<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      conf, fs, new Path(testDir, hri.getTable().getNameAsString()), hri);<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // Make a store file and write data to it.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, this.fs)<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            .withFilePath(regionFs.createTempName())<a name="line.177"></a>
-<span class="sourceLineNo">178</span>            .withFileContext(meta)<a name="line.178"></a>
-<span class="sourceLineNo">179</span>            .build();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    writeStoreFile(writer);<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    Path hsfPath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    HStoreFile hsf = new HStoreFile(this.fs, hsfPath, conf, cacheConf, BloomType.NONE, true);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    hsf.initReader();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    StoreFileReader reader = hsf.getReader();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    // Split on a row, not in middle of row.  Midkey returned by reader<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    // may be in middle of row.  Create new one with empty column and<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    // timestamp.<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    byte [] midRow = CellUtil.cloneRow(reader.midKey().get());<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    byte [] finalRow = CellUtil.cloneRow(reader.getLastKey().get());<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    hsf.closeStoreFile(true);<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>    // Make a reference<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    HRegionInfo splitHri = new HRegionInfo(hri.getTable(), null, midRow);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    Path refPath = splitStoreFile(regionFs, splitHri, TEST_FAMILY, hsf, midRow, true);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    HStoreFile refHsf = new HStoreFile(this.fs, refPath, conf, cacheConf, BloomType.NONE, true);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    refHsf.initReader();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    // Now confirm that I can read from the reference and that it only gets<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // keys from top half of the file.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    HFileScanner s = refHsf.getReader().getScanner(false, false);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    Cell kv = null;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    for (boolean first = true; (!s.isSeeked() &amp;&amp; s.seekTo()) || s.next();) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      ByteBuffer bb = ByteBuffer.wrap(((KeyValue) s.getKey()).getKey());<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      kv = KeyValueUtil.createKeyValueFromKey(bb);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      if (first) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        assertTrue(Bytes.equals(kv.getRowArray(), kv.getRowOffset(), kv.getRowLength(), midRow, 0,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          midRow.length));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        first = false;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    assertTrue(Bytes.equals(kv.getRowArray(), kv.getRowOffset(), kv.getRowLength(), finalRow, 0,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      finalRow.length));<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>  @Test<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public void testEmptyStoreFileRestrictKeyRanges() throws Exception {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    StoreFileReader reader = mock(StoreFileReader.class);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    HStore store = mock(HStore.class);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    byte[] cf = Bytes.toBytes("ty");<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder.of(cf);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    when(store.getColumnFamilyDescriptor()).thenReturn(cfd);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    StoreFileScanner scanner =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        new StoreFileScanner(reader, mock(HFileScanner.class), false, false, 0, 0, true);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    Scan scan = new Scan();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    scan.setColumnFamilyTimeRange(cf, 0, 1);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertFalse(scanner.shouldUseScanner(scan, store, 0));<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  @Test<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public void testHFileLink() throws IOException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    final HRegionInfo hri = new HRegionInfo(TableName.valueOf("testHFileLinkTb"));<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // force temp data in hbase/target/test-data instead of /tmp/hbase-xxxx/<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    Configuration testConf = new Configuration(this.conf);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    FSUtils.setRootDir(testConf, testDir);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      testConf, fs, FSUtils.getTableDir(testDir, hri.getTable()), hri);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    // Make a store file and write data to it.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, this.fs)<a name="line.240"></a>
-<span class="sourceLineNo">241</span>            .withFilePath(regionFs.createTempName())<a name="line.241"></a>
-<span class="sourceLineNo">242</span>            .withFileContext(meta)<a name="line.242"></a>
-<span class="sourceLineNo">243</span>            .build();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    writeStoreFile(writer);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Path storeFilePath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    Path dstPath = new Path(regionFs.getTableDir(), new Path("test-region", TEST_FAMILY));<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    HFileLink.create(testConf, this.fs, dstPath, hri, storeFilePath.getName());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    Path linkFilePath = new Path(dstPath,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>                  HFileLink.createHFileLinkName(hri, storeFilePath.getName()));<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>    // Try to open store file from link<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    StoreFileInfo storeFileInfo = new StoreFileInfo(testConf, this.fs, linkFilePath);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    HStoreFile hsf =<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        new HStoreFile(this.fs, storeFileInfo, testConf, cacheConf, BloomType.NONE, true);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    assertTrue(storeFileInfo.isLink());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    hsf.initReader();<a name="line.257"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.io.HFileLink;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.io.hfile.CacheStats;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoderImpl;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.io.hfile.HFileScanner;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.BloomFilterFactory;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.util.ChecksumType;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hbase.thirdparty.com.google.common.base.Joiner;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterables;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.After;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.Before;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.ClassRule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.mockito.Mockito;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Test HStoreFile<a name="line.83"></a>
+<span class="sourceLineNo">084</span> */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>@Category({RegionServerTests.class, SmallTests.class})<a name="line.85"></a>
+<span class="sourceLineNo">086</span>public class TestHStoreFile extends HBaseTestCase {<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestHStoreFile.class);<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestHStoreFile.class);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private CacheConfig cacheConf =  new CacheConfig(TEST_UTIL.getConfiguration());<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static String ROOT_DIR = TEST_UTIL.getDataTestDir("TestStoreFile").toString();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private static final ChecksumType CKTYPE = ChecksumType.CRC32C;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private static final int CKBYTES = 512;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static String TEST_FAMILY = "cf";<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  @Override<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @Before<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public void setUp() throws Exception {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    super.setUp();<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>  @Override<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @After<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public void tearDown() throws Exception {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    super.tearDown();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  /**<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * Write a file and then assert that we can read from top and bottom halves<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * using two HalfMapFiles.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @throws Exception<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  @Test<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public void testBasicHalfMapFile() throws Exception {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    final HRegionInfo hri =<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        new HRegionInfo(TableName.valueOf("testBasicHalfMapFileTb"));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      conf, fs, new Path(testDir, hri.getTable().getNameAsString()), hri);<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(2*1024).build();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, this.fs)<a name="line.125"></a>
+<span class="sourceLineNo">126</span>            .withFilePath(regionFs.createTempName())<a name="line.126"></a>
+<span class="sourceLineNo">127</span>            .withFileContext(meta)<a name="line.127"></a>
+<span class="sourceLineNo">128</span>            .build();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    writeStoreFile(writer);<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    Path sfPath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    HStoreFile sf = new HStoreFile(this.fs, sfPath, conf, cacheConf, BloomType.NONE, true);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    checkHalfHFile(regionFs, sf);<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>  private void writeStoreFile(final StoreFileWriter writer) throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    writeStoreFile(writer, Bytes.toBytes(getName()), Bytes.toBytes(getName()));<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  // pick an split point (roughly halfway)<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  byte[] SPLITKEY = new byte[] { (LAST_CHAR + FIRST_CHAR)/2, FIRST_CHAR};<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  /*<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * Writes HStoreKey and ImmutableBytes data to passed writer and<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * then closes it.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @param writer<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @throws IOException<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public static void writeStoreFile(final StoreFileWriter writer, byte[] fam, byte[] qualifier)<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  throws IOException {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    long now = System.currentTimeMillis();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    try {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      for (char d = FIRST_CHAR; d &lt;= LAST_CHAR; d++) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        for (char e = FIRST_CHAR; e &lt;= LAST_CHAR; e++) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          byte[] b = new byte[] { (byte) d, (byte) e };<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          writer.append(new KeyValue(b, fam, qualifier, now, b));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      }<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    } finally {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      writer.close();<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>  /**<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * Test that our mechanism of writing store files in one region to reference<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * store files in other regions works.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @throws IOException<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  @Test<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public void testReference() throws IOException {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    final HRegionInfo hri = new HRegionInfo(TableName.valueOf("testReferenceTb"));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      conf, fs, new Path(testDir, hri.getTable().getNameAsString()), hri);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    // Make a store file and write data to it.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, this.fs)<a name="line.177"></a>
+<span class="sourceLineNo">178</span>            .withFilePath(regionFs.createTempName())<a name="line.178"></a>
+<span class="sourceLineNo">179</span>            .withFileContext(meta)<a name="line.179"></a>
+<span class="sourceLineNo">180</span>            .build();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    writeStoreFile(writer);<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    Path hsfPath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    HStoreFile hsf = new HStoreFile(this.fs, hsfPath, conf, cacheConf, BloomType.NONE, true);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    hsf.initReader();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    StoreFileReader reader = hsf.getReader();<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // Split on a row, not in middle of row.  Midkey returned by reader<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    // may be in middle of row.  Create new one with empty column and<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    // timestamp.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    byte [] midRow = CellUtil.cloneRow(reader.midKey().get());<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    byte [] finalRow = CellUtil.cloneRow(reader.getLastKey().get());<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    hsf.closeStoreFile(true);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    // Make a reference<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    HRegionInfo splitHri = new HRegionInfo(hri.getTable(), null, midRow);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Path refPath = splitStoreFile(regionFs, splitHri, TEST_FAMILY, hsf, midRow, true);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    HStoreFile refHsf = new HStoreFile(this.fs, refPath, conf, cacheConf, BloomType.NONE, true);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    refHsf.initReader();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    // Now confirm that I can read from the reference and that it only gets<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    // keys from top half of the file.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    HFileScanner s = refHsf.getReader().getScanner(false, false);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    Cell kv = null;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    for (boolean first = true; (!s.isSeeked() &amp;&amp; s.seekTo()) || s.next();) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      ByteBuffer bb = ByteBuffer.wrap(((KeyValue) s.getKey()).getKey());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      kv = KeyValueUtil.createKeyValueFromKey(bb);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      if (first) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        assertTrue(Bytes.equals(kv.getRowArray(), kv.getRowOffset(), kv.getRowLength(), midRow, 0,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          midRow.length));<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        first = false;<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>    assertTrue(Bytes.equals(kv.getRowArray(), kv.getRowOffset(), kv.getRowLength(), finalRow, 0,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      finalRow.length));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  @Test<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public void testStoreFileReference() throws Exception {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    final RegionInfo hri =<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        RegionInfoBuilder.newBuilder(TableName.valueOf("testStoreFileReference")).build();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(conf, fs,<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      new Path(testDir, hri.getTable().getNameAsString()), hri);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // Make a store file and write data to it.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, this.fs)<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        .withFilePath(regionFs.createTempName()).withFileContext(meta).build();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    writeStoreFile(writer);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    Path hsfPath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    writer.close();<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    HStoreFile file = new HStoreFile(this.fs, hsfPath, conf, cacheConf, BloomType.NONE, true);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    file.initReader();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    StoreFileReader r = file.getReader();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    assertNotNull(r);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    StoreFileScanner scanner =<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        new StoreFileScanner(r, mock(HFileScanner.class), false, false, 0, 0, false);<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    // Verify after instantiating scanner refCount is increased<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    assertTrue("Verify file is being referenced", file.isReferencedInReads());<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanner.close();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // Verify after closing scanner refCount is decreased<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    assertFalse("Verify file is not being referenced", file.isReferencedInReads());<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>  @Test<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public void testEmptyStoreFileRestrictKeyRanges() throws Exception {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    StoreFileReader reader = mock(StoreFileReader.class);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HStore store = mock(HStore.class);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    byte[] cf = Bytes.toBytes("ty");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder.of(cf);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    when(store.getColumnFamilyDescriptor()).thenReturn(cfd);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    StoreFileScanner scanner =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        new StoreFileScanner(reader, mock(HFileScanner.class), false, false, 0, 0, true);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    Scan scan = new Scan();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    scan.setColumnFamilyTimeRange(cf, 0, 1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    assertFalse(scanner.shouldUseScanner(scan, store, 0));<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>    // Now confirm that I can read from the link<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    int count = 1;<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    HFileScanner s = hsf.getReader().getScanner(false, false);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    s.seekTo();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    while (s.next()) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      count++;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    assertEquals((LAST_CHAR - FIRST_CHAR + 1) * (LAST_CHAR - FIRST_CHAR + 1), count);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">259</span>  @Test<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  public void testHFileLink() throws IOException {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    final HRegionInfo hri = new HRegionInfo(TableName.valueOf("testHFileLinkTb"));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // force temp data in hbase/target/test-data instead of /tmp/hbase-xxxx/<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    Configuration testConf = new Configuration(this.conf);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    FSUtils.setRootDir(testConf, testDir);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      testConf, fs, FSUtils.getTableDir(testDir, hri.getTable()), hri);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();<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>   * This test creates an hfile and then the dir structures and files to verify that references<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * to hfilelinks (created by snapshot clones) can be properly interpreted.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Test<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public void testReferenceToHFileLink() throws IOException {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // force temp data in hbase/target/test-data instead of /tmp/hbase-xxxx/<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    Configuration testConf = new Configuration(this.conf);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    FSUtils.setRootDir(testConf, testDir);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    // adding legal table name chars to verify regex handles it.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    HRegionInfo hri = new HRegionInfo(TableName.valueOf("_original-evil-name"));<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      testConf, fs, FSUtils.getTableDir(testDir, hri.getTable()), hri);<a name="line.282"></a>
-<span class="sourceLineNo">283</span><a name="line.283"></a>
-<span class="sourceLineNo">284</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // Make a store file and write data to it. &lt;root&gt;/&lt;tablename&gt;/&lt;rgn&gt;/&lt;cf&gt;/&lt;file&gt;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    StoreFileWriter writer = new StoreFileWriter.Builder(testConf, cacheConf, this.fs)<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            .withFilePath(regionFs.createTempName())<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            .withFileContext(meta)<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            .build();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    writeStoreFile(writer);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    Path storeFilePath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>    // create link to store file. &lt;root&gt;/clone/region/&lt;cf&gt;/&lt;hfile&gt;-&lt;region&gt;-&lt;table&gt;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    HRegionInfo hriClone = new HRegionInfo(TableName.valueOf("clone"));<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    HRegionFileSystem cloneRegionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      testConf, fs, FSUtils.getTableDir(testDir, hri.getTable()),<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        hriClone);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    Path dstPath = cloneRegionFs.getStoreDir(TEST_FAMILY);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    HFileLink.create(testConf, this.fs, dstPath, hri, storeFilePath.getName());<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    Path linkFilePath = new Path(dstPath,<a name="line.300"></a>
-<span class="sourceLineNo">301</span>                  HFileLink.createHFileLinkName(hri, storeFilePath.getName()));<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // create splits of the link.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // &lt;root&gt;/clone/splitA/&lt;cf&gt;/&lt;reftohfilelink&gt;,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    // &lt;root&gt;/clone/splitB/&lt;cf&gt;/&lt;reftohfilelink&gt;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    HRegionInfo splitHriA = new HRegionInfo(hri.getTable(), null, SPLITKEY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    HRegionInfo splitHriB = new HRegionInfo(hri.getTable(), SPLITKEY, null);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    HStoreFile f = new HStoreFile(fs, linkFilePath, testConf, cacheConf, BloomType.NONE, true);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    f.initReader();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    Path pathA = splitStoreFile(cloneRegionFs, splitHriA, TEST_FAMILY, f, SPLITKEY, true); // top<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    Path pathB = splitStoreFile(cloneRegionFs, splitHriB, TEST_FAMILY, f, SPLITKEY, false);// bottom<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    f.closeStoreFile(true);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    // OK test the thing<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    FSUtils.logFileSystemState(fs, testDir, LOG);<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    // There is a case where a file with the hfilelink pattern is actually a daughter<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    // reference to a hfile link.  This code in StoreFile that handles this case.<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    // Try to open store file from link<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    HStoreFile hsfA = new HStoreFile(this.fs, pathA, testConf, cacheConf, BloomType.NONE, true);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    hsfA.initReader();<a name="line.321"></a>
+<span class="sourceLineNo">269</span>    // Make a store file and write data to it.<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    StoreFileWriter writer = new StoreFileWriter.Builder(conf, cacheConf, this.fs)<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            .withFilePath(regionFs.createTempName())<a name="line.271"></a>
+<span class="sourceLineNo">272</span>            .withFileContext(meta)<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            .build();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    writeStoreFile(writer);<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    Path storeFilePath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Path dstPath = new Path(regionFs.getTableDir(), new Path("test-region", TEST_FAMILY));<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    HFileLink.create(testConf, this.fs, dstPath, hri, storeFilePath.getName());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    Path linkFilePath = new Path(dstPath,<a name="line.279"></a>
+<span class="sourceLineNo">280</span>                  HFileLink.createHFileLinkName(hri, storeFilePath.getName()));<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // Try to open store file from link<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    StoreFileInfo storeFileInfo = new StoreFileInfo(testConf, this.fs, linkFilePath);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    HStoreFile hsf =<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        new HStoreFile(this.fs, storeFileInfo, testConf, cacheConf, BloomType.NONE, true);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    assertTrue(storeFileInfo.isLink());<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    hsf.initReader();<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    // Now confirm that I can read from the link<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    int count = 1;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    HFileScanner s = hsf.getReader().getScanner(false, false);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    s.seekTo();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    while (s.next()) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      count++;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    assertEquals((LAST_CHAR - FIRST_CHAR + 1) * (LAST_CHAR - FIRST_CHAR + 1), count);<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>   * This test creates an hfile and then the dir structures and files to verify that references<a name="line.300"></a>
+<span class="sourceLineNo">301</span>   * to hfilelinks (created by snapshot clones) can be properly interpreted.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  @Test<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public void testReferenceToHFileLink() throws IOException {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // force temp data in hbase/target/test-data instead of /tmp/hbase-xxxx/<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Configuration testConf = new Configuration(this.conf);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    FSUtils.setRootDir(testConf, testDir);<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // adding legal table name chars to verify regex handles it.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    HRegionInfo hri = new HRegionInfo(TableName.valueOf("_original-evil-name"));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    HRegionFileSystem regionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      testConf, fs, FSUtils.getTableDir(testDir, hri.getTable()), hri);<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Make a store file and write data to it. &lt;root&gt;/&lt;tablename&gt;/&lt;rgn&gt;/&lt;cf&gt;/&lt;file&gt;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    StoreFileWriter writer = new StoreFileWriter.Builder(testConf, cacheConf, this.fs)<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            .withFilePath(regionFs.createTempName())<a name="line.317"></a>
+<span class="sourceLineNo">318</span>            .withFileContext(meta)<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            .build();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    writeStoreFile(writer);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Path storeFilePath = regionFs.commitStoreFile(TEST_FAMILY, writer.getPath());<a name="line.321"></a>
 <span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    // Now confirm that I can read from the ref to link<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int count = 1;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    HFileScanner s = hsfA.getReader().getScanner(false, false);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    s.seekTo();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    while (s.next()) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      count++;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    assertTrue(count &gt; 0); // read some rows here<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    // Try to open store file from link<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    HStoreFile hsfB = new HStoreFile(this.fs, pathB, testConf, cacheConf, BloomType.NONE, true);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    hsfB.initReader();<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // Now confirm that I can read from the ref to link<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    HFileScanner sB = hsfB.getReader().getScanner(false, false);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    sB.seekTo();<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    //count++ as seekTo() will advance the scanner<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    count++;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    while (sB.next()) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      count++;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">323</span>    // create link to store file. &lt;root&gt;/clone/region/&lt;cf&gt;/&lt;hfile&gt;-&lt;region&gt;-&lt;table&gt;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    HRegionInfo hriClone = new HRegionInfo(TableName.valueOf("clone"));<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    HRegionFileSystem cloneRegionFs = HRegionFileSystem.createRegionOnFileSystem(<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      testConf, fs, FSUtils.getTableDir(testDir, hri.getTable()),<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        hriClone);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    Path dstPath = cloneRegionFs.getStoreDir(TEST_FAMILY);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    HFileLink.create(testConf, this.fs, dstPath, hri, storeFilePath.getName());<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    Path linkFilePath = new Path(dstPath,<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                  HFileLink.createHFileLinkName(hri, storeFilePath.getName()));<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>    // create splits of the link.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    // &lt;root&gt;/clone/splitA/&lt;cf&gt;/&lt;reftohfilelink&gt;,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // &lt;root&gt;/clone/splitB/&lt;cf&gt;/&lt;reftohfilelink&gt;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    HRegionInfo splitHriA = new HRegionInfo(hri.getTable(), null, SPLITKEY);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    HRegionInfo splitHriB = new HRegionInfo(hri.getTable(), SPLITKEY, null);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    HStoreFile f = new HStoreFile(fs, linkFilePath, testConf, cacheConf, BloomType.NONE, true);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    f.initReader();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    Path pathA = splitStoreFile(cloneRegionFs, splitHriA, TEST_FAMILY, f, SPLITKEY, true); // top<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    Path pathB = splitStoreFile(cloneRegionFs, splitHriB, TEST_FAMILY, f, SPLITKEY, false);// bottom<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    f.closeStoreFile(true);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    // OK test the thing<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    FSUtils.logFileSystemState(fs, testDir, LOG);<a name="line.344"></a>
 <span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // read the rest of the rows<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    assertEquals((LAST_CHAR - FIRST_CHAR + 1) * (LAST_CHAR - FIRST_CHAR + 1), count);<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>  private void checkHalfHFile(final HRegionFileSystem regionFs, final HStoreFile f)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      throws IOException {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    f.initReader();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    Cell midkey = f.getReader().midKey().get();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    KeyValue midKV = (KeyValue)midkey;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    byte [] midRow = CellUtil.cloneRow(midKV);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    // Create top split.<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    HRegionInfo topHri = new HRegionInfo(regionFs.getRegionInfo().getTable(),<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        null, midRow);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    Path topPath = splitStoreFile(regionFs, topHri, TEST_FAMILY, f, midRow, true);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Create bottom split.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    HRegionInfo bottomHri = new HRegionInfo(regionFs.getRegionInfo().getTable(),<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        midRow, null);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    Path bottomPath = splitStoreFile(regionFs, bottomHri, TEST_FAMILY, f, midRow, false);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    // Make readers on top and bottom.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    HStoreFile topF = new HStoreFile(this.fs, topPath, conf, cacheConf, BloomType.NONE, true);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    topF.initReader();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    StoreFileReader top = topF.getReader();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    HStoreFile bottomF = new HStoreFile(this.fs, bottomPath, conf, cacheConf, BloomType.NONE, true);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    bottomF.initReader();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    StoreFileReader bottom = bottomF.getReader();<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    ByteBuffer previous = null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    LOG.info("Midkey: " + midKV.toString());<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    ByteBuffer bbMidkeyBytes = ByteBuffer.wrap(midKV.getKey());<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    try {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      // Now make two HalfMapFiles and assert they can read the full backing<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      // file, one from the top and the other from the bottom.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      // Test bottom half first.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      // Now test reading from the top.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      boolean first = true;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      ByteBuffer key = null;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      HFileScanner topScanner = top.getScanner(false, false);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      while ((!topScanner.isSeeked() &amp;&amp; topScanner.seekTo()) ||<a name="line.382"></a>
-<span class="sourceLineNo">383</span>             (topScanner.isSeeked() &amp;&amp; topScanner.next())) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        key = ByteBuffer.wrap(((KeyValue) topScanner.getKey()).getKey());<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>        if ((PrivateCellUtil.compare(topScanner.getReader().getComparator(), midKV, key.array(),<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          key.arrayOffset(), key.limit())) &gt; 0) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          fail("key=" + Bytes.toStringBinary(key) + " &lt; midkey=" +<a name="line.388"></a>
-<span class="sourceLineNo">389</span>              midkey);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        }<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (first) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          first = false;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          LOG.info("First in top: " + Bytes.toString(Bytes.toBytes(key)));<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      LOG.info("Last in top: " + Bytes.toString(Bytes.toBytes(key)));<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>      first = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      HFileScanner bottomScanner = bottom.getScanner(false, false);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      while ((!bottomScanner.isSeeked() &amp;&amp; bottomScanner.seekTo()) ||<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          bottomScanner.next()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        previous = ByteBuffer.wrap(((KeyValue) bottomScanner.getKey()).getKey());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        key = ByteBuffer.wrap(((KeyValue) bottomScanner.getKey()).getKey());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        if (first) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          first = false;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.info("First in bottom: " +<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            Bytes.toString(Bytes.toBytes(previous)));<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        assertTrue(key.compareTo(bbMidkeyBytes) &lt; 0);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      if (previous != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        LOG.info("Last in bottom: " + Bytes.toString(Bytes.toBytes(previous)));<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      // Remove references.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      regionFs.cleanupDaughterRegion(topHri);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      regionFs.cleanupDaughterRegion(bottomHri);<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>      // Next test using a midkey that does not exist in the file.<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      // First, do a key that is &lt; than first key. Ensure splits behave<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      // properly.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      byte [] badmidkey = Bytes.toBytes("  .");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertTrue(fs.exists(f.getPath()));<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      topPath = splitStoreFile(regionFs, topHri, TEST_FAMILY, f, badmidkey, true);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      bottomPath = splitStoreFile(regionFs, bottomHri, TEST_FAMILY, f, badmidkey, false);<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      assertNull(bottomPath);<a name="line.426"></a>
+<span class="sourceLineNo">346</span>    // There is a case where a file with the hfilelink pattern is actually a daughter<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    // reference to a hfile link.  This code in StoreFile that handles this case.<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>    // Try to open store file from link<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    HStoreFile hsfA = new HStoreFile(this.fs, pathA, testConf, cacheConf, BloomType.NONE, true);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    hsfA.initReader();<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Now confirm that I can read from the ref to link<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    int count = 1;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    HFileScanner s = hsfA.getReader().getScanner(false, false);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    s.seekTo();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    while (s.next()) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      count++;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    assertTrue(count &gt; 0); // read some rows here<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // Try to open store file from link<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    HStoreFile hsfB = new HStoreFile(this.fs, pathB, testConf, cacheConf, BloomType.NONE, true);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    hsfB.initReader();<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>    // Now confirm that I can read from the ref to link<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    HFileScanner sB = hsfB.getReader().getScanner(false, false);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    sB.seekTo();<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>    //count++ as seekTo() will advance the scanner<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    count++;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    while (sB.next()) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      count++;<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>    // read the rest of the rows<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    assertEquals((LAST_CHAR - FIRST_CHAR + 1) * (LAST_CHAR - FIRST_CHAR + 1), count);<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>  private void checkHalfHFile(final HRegionFileSystem regionFs, final HStoreFile f)<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    f.initReader();<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    Cell midkey = f.getReader().midKey().get();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    KeyValue midKV = (KeyValue)midkey;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    byte [] midRow = CellUtil.cloneRow(midKV);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    // Create top split.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    HRegionInfo topHri = new HRegionInfo(regionFs.getRegionInfo().getTable(),<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        null, midRow);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    Path topPath = splitStoreFile(regionFs, topHri, TEST_FAMILY, f, midRow, true);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    // Create bottom split.<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    HRegionInfo bottomHri = new HRegionInfo(regionFs.getRegionInfo().getTable(),<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        midRow, null);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path bottomPath = splitStoreFile(regionFs, bottomHri, TEST_FAMILY, f, midRow, false);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    // Make readers on top and bottom.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    HStoreFile topF = new HStoreFile(this.fs, topPath, conf, cacheConf, BloomType.NONE, true);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    topF.initReader();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    StoreFileReader top = topF.getReader();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStoreFile bottomF = new HStoreFile(this.fs, bottomPath, conf, cacheConf, BloomType.NONE, true);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    bottomF.initReader();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    StoreFileReader bottom = bottomF.getReader();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    ByteBuffer previous = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    LOG.info("Midkey: " + midKV.toString());<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    ByteBuffer bbMidkeyBytes = ByteBuffer.wrap(midKV.getKey());<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    try {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      // Now make two HalfMapFiles and assert they can read the full backing<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      // file, one from the top and the other from the bottom.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      // Test bottom half first.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      // Now test reading from the top.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      boolean first = true;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      ByteBuffer key = null;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      HFileScanner topScanner = top.getScanner(false, false);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      while ((!topScanner.isSeeked() &amp;&amp; topScanner.seekTo()) ||<a name="line.412"></a>
+<span class="sourceLineNo">413</span>             (topScanner.isSeeked() &amp;&amp; topScanner.next())) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        key = ByteBuffer.wrap(((KeyValue) topScanner.getKey()).getKey());<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if ((PrivateCellUtil.compare(topScanner.getReader().getComparator(), midKV, key.array(),<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          key.arrayOffset(), key.limit())) &gt; 0) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          fail("key=" + Bytes.toStringBinary(key) + " &lt; midkey=" +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>              midkey);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        if (first) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          first = false;<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          LOG.info("First in top: " + Bytes.toString(Bytes.toBytes(key)));<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      LOG.info("Last in top: " + Bytes.toString(Bytes.toBytes(key)));<a name="line.426"></a>
 <span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>      topF = new HStoreFile(this.fs, topPath, conf, cacheConf, BloomType.NONE, true);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      topF.initReader();<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      top = topF.getReader();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      // Now read from the top.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      first = true;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      topScanner = top.getScanner(false, false);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      KeyValue.KeyOnlyKeyValue keyOnlyKV = new KeyValue.KeyOnlyKeyValue();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      while ((!topScanner.isSeeked() &amp;&amp; topScanner.seekTo()) ||<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          topScanner.next()) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        key = ByteBuffer.wrap(((KeyValue) topScanner.getKey()).getKey());<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        keyOnlyKV.setKey(key.array(), 0 + key.arrayOffset(), key.limit());<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        assertTrue(PrivateCellUtil.compare(topScanner.getReader().getComparator(), keyOnlyKV,<a name="line.439"></a>
-<span class="sourceLineNo">440</span>          badmidkey, 0, badmidkey.length) &gt;= 0);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        if (first) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>          first = false;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          KeyValue keyKV = KeyValueUtil.createKeyValueFromKey(key);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          LOG.info("First top when key &lt; bottom: " + keyKV);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          String tmp =<a name="line.445"></a>
-<span class="sourceLineNo">446</span>              Bytes.toString(keyKV.getRowArray(), keyKV.getRowOffset(), keyKV.getRowLength());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          for (int i = 0; i &lt; tmp.length(); i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            assertTrue(tmp.charAt(i) == 'a');<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>      }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      KeyValue keyKV = KeyValueUtil.createKeyValueFromKey(key);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      LOG.info("Last top when key &lt; bottom: " + keyKV);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      String tmp = Bytes.toString(keyKV.getRowArray(), keyKV.getRowOffset(), keyKV.getRowLength());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      for (int i = 0; i &lt; tmp.length(); i++) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        assertTrue(tmp.charAt(i) == 'z');<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // Remove references.<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      regionFs.cleanupDaughterRegion(topHri);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      regionFs.cleanupDaughterRegion(bottomHri);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Test when badkey is &gt; than last key in file ('||' &gt; 'zz').<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      badmidkey = Bytes.toBytes("|||");<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      topPath = splitStoreFile(regionFs,topHri, TEST_FAMILY, f, badmidkey, true);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      bottomPath = splitStoreFile(regionFs, bottomHri, TEST_FAMILY, f, badmidkey, false);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      assertNull(topPath);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      bottomF = new HStoreFile(this.fs, bottomPath, conf, cacheConf, BloomType.NONE, true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      bottomF.initReader();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      bottom = bottomF.getReader();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      first = true;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      bottomScanner = bottom.getScanner(false, false);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      while ((!bottomScanner.isSeeked() &amp;&amp; bottomScanner.seekTo()) ||<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          bottomScanner.next()) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        key = ByteBuffer.wrap(((KeyValue) bottomScanner.getKey()).getKey());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (first) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          first = false;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          keyKV = KeyValueUtil.createKeyValueFromKey(key);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          LOG.info("First bottom when key &gt; top: " + keyKV);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          tmp = Bytes.toString(keyKV.getRowArray(), keyKV.getRowOffset(), keyKV.getRowLength());<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          for (int i = 0; i &lt; tmp.length(); i++) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>            assertTrue(tmp.charAt(i) == 'a');<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      keyKV = KeyValueUtil.createKeyValueFromKey(key);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      LOG.info("Last bottom when key &gt; top: " + keyKV);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      for (int i = 0; i &lt; tmp.length(); i++) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        assertTrue(Bytes.toString(keyKV.getRowArray(), keyKV.getRowOffset(), keyKV.getRowLength())<a name="line.489"></a>
-<span class="sourceLineNo">490</span>            .charAt(i) == 'z');<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      }<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    } finally {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (top != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        top.close(true); // evict since we are about to delete the file<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (bottom != null) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        bottom.close(true); // evict since we are about to delete the file<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      fs.delete(f.getPath(), true);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  private static StoreFileScanner get

<TRUNCATED>