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

[01/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site ed4b072e7 -> 67e3bccdd


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
index 3bac9bd..ef6d0fe 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
@@ -44,317 +44,328 @@
 <span class="sourceLineNo">036</span>import org.apache.commons.io.IOUtils;<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.HRegionInfo;<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.NotServingRegionException;<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.TableNotFoundException;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.security.User;<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.MediumTests;<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.junit.After;<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>@Category({ MediumTests.class, ClientTests.class })<a name="line.57"></a>
-<span class="sourceLineNo">058</span>public class TestAsyncNonMetaRegionLocator {<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  @ClassRule<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      HBaseClassTestRule.forClass(TestAsyncNonMetaRegionLocator.class);<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private static AsyncConnectionImpl CONN;<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static AsyncNonMetaRegionLocator LOCATOR;<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private static byte[][] SPLIT_KEYS;<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @BeforeClass<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public static void setUp() throws Exception {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    TEST_UTIL.startMiniCluster(3);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    TEST_UTIL.getAdmin().setBalancerRunning(false, true);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    AsyncRegistry registry = AsyncRegistryFactory.getRegistry(TEST_UTIL.getConfiguration());<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    CONN = new AsyncConnectionImpl(TEST_UTIL.getConfiguration(), registry,<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        registry.getClusterId().get(), User.getCurrent());<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    LOCATOR = new AsyncNonMetaRegionLocator(CONN);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    SPLIT_KEYS = new byte[8][];<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    for (int i = 111; i &lt; 999; i += 111) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      SPLIT_KEYS[i / 111 - 1] = Bytes.toBytes(String.format("%03d", i));<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  @AfterClass<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public static void tearDown() throws Exception {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    IOUtils.closeQuietly(CONN);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    TEST_UTIL.shutdownMiniCluster();<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>  @After<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  public void tearDownAfterTest() throws IOException {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    if (admin.tableExists(TABLE_NAME)) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      if (admin.isTableEnabled(TABLE_NAME)) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        TEST_UTIL.getAdmin().disableTable(TABLE_NAME);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      TEST_UTIL.getAdmin().deleteTable(TABLE_NAME);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    LOCATOR.clearCache(TABLE_NAME);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  private void createSingleRegionTable() throws IOException, InterruptedException {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<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>  @Test<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void testNoTable() throws InterruptedException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      try {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      } catch (ExecutionException e) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<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><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  @Test<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public void testDisableTable() throws IOException, InterruptedException {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    createSingleRegionTable();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    TEST_UTIL.getAdmin().disableTable(TABLE_NAME);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      try {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      } catch (ExecutionException e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<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>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private void assertLocEquals(byte[] startKey, byte[] endKey, ServerName serverName,<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      HRegionLocation loc) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    HRegionInfo info = loc.getRegionInfo();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    assertEquals(TABLE_NAME, info.getTable());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    assertArrayEquals(startKey, info.getStartKey());<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    assertArrayEquals(endKey, info.getEndKey());<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    assertEquals(serverName, loc.getServerName());<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 testSingleRegionTable() throws IOException, InterruptedException, ExecutionException {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    createSingleRegionTable();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ServerName serverName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    byte[] randKey = new byte[ThreadLocalRandom.current().nextInt(128)];<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    ThreadLocalRandom.current().nextBytes(randKey);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        LOCATOR.getRegionLocation(TABLE_NAME, randKey, locateType, false).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">162</span>  private void createMultiRegionTable() throws IOException, InterruptedException {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY, SPLIT_KEYS);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<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>  private static byte[][] getStartKeys() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    byte[][] startKeys = new byte[SPLIT_KEYS.length + 1][];<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    startKeys[0] = EMPTY_START_ROW;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    System.arraycopy(SPLIT_KEYS, 0, startKeys, 1, SPLIT_KEYS.length);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    return startKeys;<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 static byte[][] getEndKeys() {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    byte[][] endKeys = Arrays.copyOf(SPLIT_KEYS, SPLIT_KEYS.length + 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    endKeys[endKeys.length - 1] = EMPTY_START_ROW;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    return endKeys;<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 ServerName[] getLocations(byte[][] startKeys) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    ServerName[] serverNames = new ServerName[startKeys.length];<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream().map(t -&gt; t.getRegionServer())<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        .forEach(rs -&gt; {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          rs.getRegions(TABLE_NAME).forEach(r -&gt; {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>            serverNames[Arrays.binarySearch(startKeys, r.getRegionInfo().getStartKey(),<a name="line.185"></a>
-<span class="sourceLineNo">186</span>              Bytes::compareTo)] = rs.getServerName();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          });<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        });<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    return serverNames;<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 testMultiRegionTable() throws IOException, InterruptedException {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    createMultiRegionTable();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    byte[][] startKeys = getStartKeys();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    ServerName[] serverNames = getLocations(startKeys);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    IntStream.range(0, 2).forEach(n -&gt; IntStream.range(0, startKeys.length).forEach(i -&gt; {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      try {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        assertLocEquals(startKeys[i], i == startKeys.length - 1 ? EMPTY_END_ROW : startKeys[i + 1],<a name="line.199"></a>
-<span class="sourceLineNo">200</span>          serverNames[i], LOCATOR<a name="line.200"></a>
-<span class="sourceLineNo">201</span>              .getRegionLocation(TABLE_NAME, startKeys[i], RegionLocateType.CURRENT, false).get());<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        throw new RuntimeException(e);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }));<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>    LOCATOR.clearCache(TABLE_NAME);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    IntStream.range(0, 2).forEach(n -&gt; IntStream.range(0, startKeys.length).forEach(i -&gt; {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      try {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        assertLocEquals(startKeys[i], i == startKeys.length - 1 ? EMPTY_END_ROW : startKeys[i + 1],<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          serverNames[i],<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          LOCATOR.getRegionLocation(TABLE_NAME, startKeys[i], RegionLocateType.AFTER, false).get());<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        throw new RuntimeException(e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    }));<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    LOCATOR.clearCache(TABLE_NAME);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    byte[][] endKeys = getEndKeys();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    IntStream.range(0, 2).forEach(<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      n -&gt; IntStream.range(0, endKeys.length).map(i -&gt; endKeys.length - 1 - i).forEach(i -&gt; {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        try {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          assertLocEquals(i == 0 ? EMPTY_START_ROW : endKeys[i - 1], endKeys[i], serverNames[i],<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            LOCATOR.getRegionLocation(TABLE_NAME, endKeys[i], RegionLocateType.BEFORE, false)<a name="line.224"></a>
-<span class="sourceLineNo">225</span>                .get());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          throw new RuntimeException(e);<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>  @Test<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void testRegionMove() throws IOException, InterruptedException, ExecutionException {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    createSingleRegionTable();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    ServerName serverName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    HRegionLocation loc = LOCATOR<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName, loc);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    ServerName newServerName = TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream()<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        .map(t -&gt; t.getRegionServer().getServerName()).filter(sn -&gt; !sn.equals(serverName))<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        .findAny().get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    TEST_UTIL.getAdmin().move(Bytes.toBytes(loc.getRegionInfo().getEncodedName()),<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      Bytes.toBytes(newServerName.getServerName()));<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    while (!TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName()<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        .equals(newServerName)) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      Thread.sleep(100);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Should be same as it is in cache<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    assertSame(loc, LOCATOR<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get());<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOCATOR.updateCachedLocation(loc, null);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    // null error will not trigger a cache cleanup<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    assertSame(loc, LOCATOR<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    LOCATOR.updateCachedLocation(loc, new NotServingRegionException());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, newServerName, LOCATOR<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get());<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  // usually locate after will return the same result, so we add a test to make it return different<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  // result.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  @Test<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public void testLocateAfter() throws IOException, InterruptedException, ExecutionException {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    byte[] row = Bytes.toBytes("1");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    byte[] splitKey = Arrays.copyOf(row, 2);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY, new byte[][] { splitKey });<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    HRegionLocation currentLoc =<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        LOCATOR.getRegionLocation(TABLE_NAME, row, RegionLocateType.CURRENT, false).get();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    ServerName currentServerName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    assertLocEquals(EMPTY_START_ROW, splitKey, currentServerName, currentLoc);<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    HRegionLocation afterLoc =<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        LOCATOR.getRegionLocation(TABLE_NAME, row, RegionLocateType.AFTER, false).get();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    ServerName afterServerName =<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream().map(t -&gt; t.getRegionServer())<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            .filter(rs -&gt; rs.getRegions(TABLE_NAME).stream()<a name="line.278"></a>
-<span class="sourceLineNo">279</span>                .anyMatch(r -&gt; Bytes.equals(splitKey, r.getRegionInfo().getStartKey())))<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            .findAny().get().getServerName();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    assertLocEquals(splitKey, EMPTY_END_ROW, afterServerName, afterLoc);<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>    assertSame(afterLoc,<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      LOCATOR.getRegionLocation(TABLE_NAME, row, RegionLocateType.AFTER, false).get());<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>  // For HBASE-17402<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  @Test<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  public void testConcurrentLocate() throws IOException, InterruptedException, ExecutionException {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    createMultiRegionTable();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    byte[][] startKeys = getStartKeys();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    byte[][] endKeys = getEndKeys();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    ServerName[] serverNames = getLocations(startKeys);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    for (int i = 0; i &lt; 100; i++) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      LOCATOR.clearCache(TABLE_NAME);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      List&lt;CompletableFuture&lt;HRegionLocation&gt;&gt; futures = IntStream.range(0, 1000)<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          .mapToObj(n -&gt; String.format("%03d", n)).map(s -&gt; Bytes.toBytes(s))<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          .map(r -&gt; LOCATOR.getRegionLocation(TABLE_NAME, r, RegionLocateType.CURRENT, false))<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          .collect(toList());<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      for (int j = 0; j &lt; 1000; j++) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        int index = Math.min(8, j / 111);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        assertLocEquals(startKeys[index], endKeys[index], serverNames[index], futures.get(j).get());<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>  }<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>  @Test<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  public void testReload() throws Exception {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    createSingleRegionTable();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    ServerName serverName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    ServerName newServerName = TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream()<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        .map(t -&gt; t.getRegionServer().getServerName()).filter(sn -&gt; !sn.equals(serverName))<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        .findAny().get();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    HRegionInfo region = admin.getTableRegions(TABLE_NAME).stream().findAny().get();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    admin.move(region.getEncodedNameAsBytes(), Bytes.toBytes(newServerName.getServerName()));<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    TEST_UTIL.waitFor(30000, new ExplainingPredicate&lt;Exception&gt;() {<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>      @Override<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      public boolean evaluate() throws Exception {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        ServerName newServerName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        return newServerName != null &amp;&amp; !newServerName.equals(serverName);<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>      @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      public String explainFailure() throws Exception {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return region.getRegionNameAsString() + " is still on " + serverName;<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>    // The cached location will not change<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    // should get the new location when reload = true<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, newServerName,<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, true).get());<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    // the cached location should be replaced<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, newServerName,<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<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">039</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.ServerName;<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.TableNotFoundException;<a name="line.43"></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.security.User;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.testclassification.ClientTests;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.junit.After;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.junit.AfterClass;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.junit.BeforeClass;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.junit.ClassRule;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.Test;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.experimental.categories.Category;<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>@Category({ MediumTests.class, ClientTests.class })<a name="line.56"></a>
+<span class="sourceLineNo">057</span>public class TestAsyncNonMetaRegionLocator {<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  @ClassRule<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      HBaseClassTestRule.forClass(TestAsyncNonMetaRegionLocator.class);<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private static TableName TABLE_NAME = TableName.valueOf("async");<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static byte[] FAMILY = Bytes.toBytes("cf");<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private static AsyncConnectionImpl CONN;<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private static AsyncNonMetaRegionLocator LOCATOR;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  private static byte[][] SPLIT_KEYS;<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  @BeforeClass<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  public static void setUp() throws Exception {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    TEST_UTIL.startMiniCluster(3);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    TEST_UTIL.getAdmin().balancerSwitch(false, true);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    AsyncRegistry registry = AsyncRegistryFactory.getRegistry(TEST_UTIL.getConfiguration());<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    CONN = new AsyncConnectionImpl(TEST_UTIL.getConfiguration(), registry,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        registry.getClusterId().get(), User.getCurrent());<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    LOCATOR = new AsyncNonMetaRegionLocator(CONN);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    SPLIT_KEYS = new byte[8][];<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    for (int i = 111; i &lt; 999; i += 111) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      SPLIT_KEYS[i / 111 - 1] = Bytes.toBytes(String.format("%03d", i));<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><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @AfterClass<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static void tearDown() throws Exception {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    IOUtils.closeQuietly(CONN);<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>  @After<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public void tearDownAfterTest() throws IOException {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    if (admin.tableExists(TABLE_NAME)) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      if (admin.isTableEnabled(TABLE_NAME)) {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>        TEST_UTIL.getAdmin().disableTable(TABLE_NAME);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      TEST_UTIL.getAdmin().deleteTable(TABLE_NAME);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    }<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    LOCATOR.clearCache(TABLE_NAME);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private void createSingleRegionTable() throws IOException, InterruptedException {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<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>  @Test<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public void testNoTable() throws InterruptedException {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      try {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      } catch (ExecutionException e) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<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><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  @Test<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  public void testDisableTable() throws IOException, InterruptedException {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    createSingleRegionTable();<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    TEST_UTIL.getAdmin().disableTable(TABLE_NAME);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      try {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      } catch (ExecutionException e) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        assertThat(e.getCause(), instanceOf(TableNotFoundException.class));<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      }<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><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private void assertLocEquals(byte[] startKey, byte[] endKey, ServerName serverName,<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      HRegionLocation loc) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    RegionInfo info = loc.getRegion();<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    assertEquals(TABLE_NAME, info.getTable());<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    assertArrayEquals(startKey, info.getStartKey());<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    assertArrayEquals(endKey, info.getEndKey());<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    assertEquals(serverName, loc.getServerName());<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>  @Test<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public void testSingleRegionTable() throws IOException, InterruptedException, ExecutionException {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    createSingleRegionTable();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    ServerName serverName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    byte[] randKey = new byte[ThreadLocalRandom.current().nextInt(128)];<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    ThreadLocalRandom.current().nextBytes(randKey);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        LOCATOR.getRegionLocation(TABLE_NAME, randKey, locateType, false).get());<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>  private void createMultiRegionTable() throws IOException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY, SPLIT_KEYS);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<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>  private static byte[][] getStartKeys() {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    byte[][] startKeys = new byte[SPLIT_KEYS.length + 1][];<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    startKeys[0] = EMPTY_START_ROW;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    System.arraycopy(SPLIT_KEYS, 0, startKeys, 1, SPLIT_KEYS.length);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return startKeys;<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 static byte[][] getEndKeys() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    byte[][] endKeys = Arrays.copyOf(SPLIT_KEYS, SPLIT_KEYS.length + 1);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    endKeys[endKeys.length - 1] = EMPTY_START_ROW;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    return endKeys;<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>  private ServerName[] getLocations(byte[][] startKeys) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    ServerName[] serverNames = new ServerName[startKeys.length];<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream().map(t -&gt; t.getRegionServer())<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        .forEach(rs -&gt; {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          rs.getRegions(TABLE_NAME).forEach(r -&gt; {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>            serverNames[Arrays.binarySearch(startKeys, r.getRegionInfo().getStartKey(),<a name="line.184"></a>
+<span class="sourceLineNo">185</span>              Bytes::compareTo)] = rs.getServerName();<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 serverNames;<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 testMultiRegionTable() throws IOException, InterruptedException {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    createMultiRegionTable();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    byte[][] startKeys = getStartKeys();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    ServerName[] serverNames = getLocations(startKeys);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    IntStream.range(0, 2).forEach(n -&gt; IntStream.range(0, startKeys.length).forEach(i -&gt; {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        assertLocEquals(startKeys[i], i == startKeys.length - 1 ? EMPTY_END_ROW : startKeys[i + 1],<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          serverNames[i], LOCATOR<a name="line.199"></a>
+<span class="sourceLineNo">200</span>              .getRegionLocation(TABLE_NAME, startKeys[i], RegionLocateType.CURRENT, false).get());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        throw new RuntimeException(e);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    }));<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>    LOCATOR.clearCache(TABLE_NAME);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    IntStream.range(0, 2).forEach(n -&gt; IntStream.range(0, startKeys.length).forEach(i -&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      try {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        assertLocEquals(startKeys[i], i == startKeys.length - 1 ? EMPTY_END_ROW : startKeys[i + 1],<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          serverNames[i],<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          LOCATOR.getRegionLocation(TABLE_NAME, startKeys[i], RegionLocateType.AFTER, false).get());<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        throw new RuntimeException(e);<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>    LOCATOR.clearCache(TABLE_NAME);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    byte[][] endKeys = getEndKeys();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    IntStream.range(0, 2).forEach(<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      n -&gt; IntStream.range(0, endKeys.length).map(i -&gt; endKeys.length - 1 - i).forEach(i -&gt; {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        try {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          assertLocEquals(i == 0 ? EMPTY_START_ROW : endKeys[i - 1], endKeys[i], serverNames[i],<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            LOCATOR.getRegionLocation(TABLE_NAME, endKeys[i], RegionLocateType.BEFORE, false)<a name="line.223"></a>
+<span class="sourceLineNo">224</span>                .get());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          throw new RuntimeException(e);<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>  @Test<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  public void testRegionMove() throws IOException, InterruptedException, ExecutionException {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    createSingleRegionTable();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    ServerName serverName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    HRegionLocation loc = LOCATOR<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName, loc);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    ServerName newServerName = TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream()<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        .map(t -&gt; t.getRegionServer().getServerName()).filter(sn -&gt; !sn.equals(serverName))<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        .findAny().get();<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    TEST_UTIL.getAdmin().move(Bytes.toBytes(loc.getRegion().getEncodedName()),<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      Bytes.toBytes(newServerName.getServerName()));<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    while (!TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName()<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        .equals(newServerName)) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      Thread.sleep(100);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    // Should be same as it is in cache<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    assertSame(loc, LOCATOR<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    LOCATOR.updateCachedLocation(loc, null);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    // null error will not trigger a cache cleanup<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    assertSame(loc, LOCATOR<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    LOCATOR.updateCachedLocation(loc, new NotServingRegionException());<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, newServerName, LOCATOR<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        .getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false).get());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  // usually locate after will return the same result, so we add a test to make it return different<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  // result.<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  @Test<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  public void testLocateAfter() throws IOException, InterruptedException, ExecutionException {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    byte[] row = Bytes.toBytes("1");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    byte[] splitKey = Arrays.copyOf(row, 2);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    TEST_UTIL.createTable(TABLE_NAME, FAMILY, new byte[][] { splitKey });<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    TEST_UTIL.waitTableAvailable(TABLE_NAME);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    HRegionLocation currentLoc =<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        LOCATOR.getRegionLocation(TABLE_NAME, row, RegionLocateType.CURRENT, false).get();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    ServerName currentServerName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    assertLocEquals(EMPTY_START_ROW, splitKey, currentServerName, currentLoc);<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    HRegionLocation afterLoc =<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        LOCATOR.getRegionLocation(TABLE_NAME, row, RegionLocateType.AFTER, false).get();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    ServerName afterServerName =<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream().map(t -&gt; t.getRegionServer())<a name="line.276"></a>
+<span class="sourceLineNo">277</span>            .filter(rs -&gt; rs.getRegions(TABLE_NAME).stream()<a name="line.277"></a>
+<span class="sourceLineNo">278</span>                .anyMatch(r -&gt; Bytes.equals(splitKey, r.getRegionInfo().getStartKey())))<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            .findAny().get().getServerName();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    assertLocEquals(splitKey, EMPTY_END_ROW, afterServerName, afterLoc);<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    assertSame(afterLoc,<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      LOCATOR.getRegionLocation(TABLE_NAME, row, RegionLocateType.AFTER, false).get());<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>  // For HBASE-17402<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  @Test<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public void testConcurrentLocate() throws IOException, InterruptedException, ExecutionException {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    createMultiRegionTable();<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    byte[][] startKeys = getStartKeys();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    byte[][] endKeys = getEndKeys();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    ServerName[] serverNames = getLocations(startKeys);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    for (int i = 0; i &lt; 100; i++) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      LOCATOR.clearCache(TABLE_NAME);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      List&lt;CompletableFuture&lt;HRegionLocation&gt;&gt; futures = IntStream.range(0, 1000)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          .mapToObj(n -&gt; String.format("%03d", n)).map(s -&gt; Bytes.toBytes(s))<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          .map(r -&gt; LOCATOR.getRegionLocation(TABLE_NAME, r, RegionLocateType.CURRENT, false))<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          .collect(toList());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      for (int j = 0; j &lt; 1000; j++) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        int index = Math.min(8, j / 111);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        assertLocEquals(startKeys[index], endKeys[index], serverNames[index], futures.get(j).get());<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>  }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  @Test<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public void testReload() throws Exception {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    createSingleRegionTable();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    ServerName serverName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    ServerName newServerName = TEST_UTIL.getHBaseCluster().getRegionServerThreads().stream()<a name="line.314"></a>
+<span class="sourceLineNo">315</span>        .map(t -&gt; t.getRegionServer().getServerName()).filter(sn -&gt; !sn.equals(serverName))<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        .findAny().get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    RegionInfo region = admin.getRegions(TABLE_NAME).stream().findAny().get();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    admin.move(region.getEncodedNameAsBytes(), Bytes.toBytes(newServerName.getServerName()));<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    TEST_UTIL.waitFor(30000, new ExplainingPredicate&lt;Exception&gt;() {<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 boolean evaluate() throws Exception {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        ServerName newServerName = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME).getServerName();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        return newServerName != null &amp;&amp; !newServerName.equals(serverName);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>      @Override<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public String explainFailure() throws Exception {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        return region.getRegionNameAsString() + " is still on " + serverName;<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>    });<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    // The cached location will not change<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, serverName,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    // should get the new location when reload = true<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, newServerName,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, true).get());<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    // the cached location should be replaced<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    for (RegionLocateType locateType : RegionLocateType.values()) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      assertLocEquals(EMPTY_START_ROW, EMPTY_END_ROW, newServerName,<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_START_ROW, locateType, false).get());<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Testcase for HBASE-20822<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  @Test<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public void testLocateBeforeLastRegion()<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    createMultiRegionTable();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    LOCATOR.getRegionLocation(TABLE_NAME, SPLIT_KEYS[0], RegionLocateType.CURRENT, false).join();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    HRegionLocation loc =<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      LOCATOR.getRegionLocation(TABLE_NAME, EMPTY_END_ROW, RegionLocateType.BEFORE, false).get();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    // should locate to the last region<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    assertArrayEquals(loc.getRegion().getEndKey(), EMPTY_END_ROW);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/testdevapidocs/src-html/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
index 4ebab86..f251bc4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
@@ -203,8 +203,33 @@
 <span class="sourceLineNo">195</span>    assertEquals(3, operationTasks.size());<a name="line.195"></a>
 <span class="sourceLineNo">196</span>    tm.shutdown();<a name="line.196"></a>
 <span class="sourceLineNo">197</span>  }<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">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  @Test<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  public void testStatusJournal() {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    TaskMonitor tm = new TaskMonitor(new Configuration());<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    MonitoredTask task = tm.createStatus("Test task");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    assertTrue(task.getStatusJournal().isEmpty());<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    task.disableStatusJournal();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    task.setStatus("status1");<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    // journal should be empty since it is disabled<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    assertTrue(task.getStatusJournal().isEmpty());<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    task.enableStatusJournal(true);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    // check existing status entered in journal<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    assertEquals("status1", task.getStatusJournal().get(0).getStatus());<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    assertTrue(task.getStatusJournal().get(0).getTimeStamp() &gt; 0);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    task.disableStatusJournal();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    task.setStatus("status2");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // check status 2 not added since disabled<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    assertEquals(1, task.getStatusJournal().size());<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    task.enableStatusJournal(false);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // size should still be 1 since we didn't include current status<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    assertEquals(1, task.getStatusJournal().size());<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    task.setStatus("status3");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    assertEquals("status3", task.getStatusJournal().get(1).getStatus());<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    tm.shutdown();<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><a name="line.224"></a>
 
 
 


[14/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span clas

<TRUNCATED>

[06/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceLineNo">255

<TRUNCATED>

[08/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="so

<TRUNCATED>

[12/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceLineNo

<TRUNCATED>

[29/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 4731985..417b5bb 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -284,7 +284,7 @@
 <td>3690</td>
 <td>0</td>
 <td>0</td>
-<td>15789</td></tr></table></div>
+<td>15788</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -6342,7 +6342,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegion.java">org/apache/hadoop/hbase/regionserver/HRegion.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>214</td></tr>
+<td>213</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java</a></td>
 <td>0</td>
@@ -9859,7 +9859,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1873</td>
+<td>1872</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>coding</td>
@@ -72475,7 +72475,7 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
-<td>24</td></tr></table></div>
+<td>26</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.StateDumpServlet.java">org/apache/hadoop/hbase/monitoring/StateDumpServlet.java</h3>
 <table border="0" class="table table-striped">
@@ -79342,499 +79342,487 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2161</td></tr>
+<td>2162</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>2162</td></tr>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>2185</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2181</td></tr>
+<td>2188</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2184</td></tr>
+<td>2235</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2231</td></tr>
+<td>2236</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2232</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 101).</td>
-<td>2419</td></tr>
-<tr class="b">
+<td>2425</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>2527</td></tr>
-<tr class="a">
+<td>2533</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>2599</td></tr>
-<tr class="b">
+<td>2605</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>2618</td></tr>
-<tr class="a">
+<td>2624</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>2640</td></tr>
-<tr class="b">
+<td>2646</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>2672</td></tr>
-<tr class="a">
+<td>2678</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>2815</td></tr>
-<tr class="b">
+<td>2821</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>2830</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>2880</td></tr>
+<td>2836</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>2920</td></tr>
+<td>2886</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>2933</td></tr>
+<td>2926</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>2934</td></tr>
+<td>2939</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>2935</td></tr>
+<td>2940</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>2936</td></tr>
+<td>2941</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>2942</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>4030</td></tr>
-<tr class="b">
+<td>4036</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>4080</td></tr>
-<tr class="a">
+<td>4086</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>4177</td></tr>
-<tr class="b">
+<td>4183</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>4253</td></tr>
-<tr class="a">
+<td>4259</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>4263</td></tr>
-<tr class="b">
+<td>4269</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>4264</td></tr>
-<tr class="a">
+<td>4270</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>4269</td></tr>
-<tr class="b">
+<td>4275</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>4313</td></tr>
-<tr class="a">
+<td>4319</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' has incorrect indentation level 3, expected level should be 4.</td>
-<td>4347</td></tr>
-<tr class="b">
+<td>4353</td></tr>
+<tr class="a">
 <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 5, expected level should be 6.</td>
-<td>4348</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>4401</td></tr>
+<td>4354</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>4402</td></tr>
+<td>4407</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>4412</td></tr>
+<td>4408</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>4414</td></tr>
+<td>4418</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>4475</td></tr>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>4420</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>4477</td></tr>
+<td>4481</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>4483</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>4478</td></tr>
-<tr class="b">
+<td>4484</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>4499</td></tr>
-<tr class="a">
+<td>4505</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>4506</td></tr>
-<tr class="b">
+<td>4512</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 199 lines (max allowed is 150).</td>
-<td>4588</td></tr>
-<tr class="a">
-<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 9, expected level should be 8.</td>
-<td>4785</td></tr>
+<td>4594</td></tr>
 <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 6, expected level should be 8.</td>
-<td>4873</td></tr>
-<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 8, expected level should be 10.</td>
-<td>4874</td></tr>
-<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 8, expected level should be 10.</td>
-<td>4875</td></tr>
+<td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
+<td>4791</td></tr>
 <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 6, expected level should be 8.</td>
-<td>4876</td></tr>
+<td>4879</td></tr>
 <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 8, expected level should be 10.</td>
-<td>4877</td></tr>
+<td>4880</td></tr>
 <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 8, expected level should be 10.</td>
-<td>4878</td></tr>
+<td>4881</td></tr>
 <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 6, expected level should be 8.</td>
-<td>4879</td></tr>
+<td>4882</td></tr>
 <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 8, expected level should be 10.</td>
-<td>4880</td></tr>
+<td>4883</td></tr>
 <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 8, expected level should be 10.</td>
-<td>4881</td></tr>
+<td>4884</td></tr>
 <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 6, expected level should be 8.</td>
-<td>4882</td></tr>
+<td>4885</td></tr>
 <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 8, expected level should be 10.</td>
-<td>4883</td></tr>
+<td>4886</td></tr>
 <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 8, expected level should be 10.</td>
-<td>4884</td></tr>
+<td>4887</td></tr>
 <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 6, expected level should be 8.</td>
-<td>4885</td></tr>
+<td>4888</td></tr>
 <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 8, expected level should be 10.</td>
-<td>4886</td></tr>
+<td>4889</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>4887</td></tr>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>4890</td></tr>
 <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 6, expected level should be 8.</td>
+<td>4891</td></tr>
+<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 8, expected level should be 10.</td>
-<td>4889</td></tr>
+<td>4892</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 call' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>4893</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>5135</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>4895</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>5136</td></tr>
+<td>5141</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>5137</td></tr>
+<td>5142</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>5138</td></tr>
+<td>5143</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>5179</td></tr>
+<td>5144</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>5619</td></tr>
+<td>5185</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>5708</td></tr>
+<td>5625</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>5714</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>5946</td></tr>
-<tr class="b">
+<td>5952</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>5947</td></tr>
-<tr class="a">
+<td>5953</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 114).</td>
-<td>5951</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>5967</td></tr>
+<td>5957</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>5976</td></tr>
+<td>5973</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>5984</td></tr>
+<td>5982</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>5994</td></tr>
+<td>5990</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>6000</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>5996</td></tr>
-<tr class="a">
+<td>6002</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 193 lines (max allowed is 150).</td>
-<td>6001</td></tr>
-<tr class="b">
+<td>6007</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 4, expected level should be 6.</td>
-<td>6382</td></tr>
-<tr class="a">
+<td>6388</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>6460</td></tr>
-<tr class="b">
+<td>6466</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>6461</td></tr>
-<tr class="a">
+<td>6467</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>6481</td></tr>
-<tr class="b">
+<td>6487</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>6501</td></tr>
-<tr class="a">
+<td>6507</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>6502</td></tr>
-<tr class="b">
+<td>6508</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 221 lines (max allowed is 150).</td>
-<td>6521</td></tr>
-<tr class="a">
+<td>6527</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>6576</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>6733</td></tr>
+<td>6582</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>6747</td></tr>
+<td>6739</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
@@ -79843,836 +79831,842 @@
 <td>6753</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>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>6759</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>6761</td></tr>
+<td>6765</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>6767</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>6804</td></tr>
+<td>6810</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>6895</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6889</td></tr>
+<td>6897</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6891</td></tr>
+<td>6898</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6892</td></tr>
+<td>6899</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6893</td></tr>
+<td>6900</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6894</td></tr>
+<td>6901</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6895</td></tr>
+<td>6905</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>6937</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>6942</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>6950</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6899</td></tr>
+<td>6967</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>6968</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>6969</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>6931</td></tr>
-<tr class="b">
+<td>6972</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>6936</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>6944</td></tr>
+<td>6977</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6961</td></tr>
+<td>6986</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6962</td></tr>
+<td>6987</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6963</td></tr>
+<td>6988</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>6966</td></tr>
+<td>6994</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>6971</td></tr>
+<td>7000</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6980</td></tr>
+<td>7010</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6981</td></tr>
+<td>7011</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>6982</td></tr>
+<td>7012</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>6988</td></tr>
+<td>7015</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>6994</td></tr>
+<td>7019</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7004</td></tr>
+<td>7029</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7005</td></tr>
+<td>7030</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7006</td></tr>
+<td>7031</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>7009</td></tr>
+<td>7036</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>7013</td></tr>
+<td>7042</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7023</td></tr>
+<td>7061</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7024</td></tr>
+<td>7062</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7025</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>7030</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>7036</td></tr>
+<td>7063</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7055</td></tr>
+<td>7080</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7056</td></tr>
+<td>7081</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7057</td></tr>
+<td>7082</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7074</td></tr>
+<td>7103</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7075</td></tr>
+<td>7104</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7076</td></tr>
+<td>7105</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7097</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7098</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7099</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>7109</td></tr>
-<tr class="b">
+<td>7115</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>7147</td></tr>
-<tr class="a">
+<td>7153</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>7199</td></tr>
-<tr class="b">
+<td>7205</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>7339</td></tr>
-<tr class="a">
+<td>7345</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7371</td></tr>
-<tr class="b">
+<td>7377</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7375</td></tr>
-<tr class="a">
+<td>7381</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>7377</td></tr>
-<tr class="b">
+<td>7383</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>7548</td></tr>
-<tr class="a">
+<td>7554</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>7568</td></tr>
-<tr class="b">
+<td>7574</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 104).</td>
-<td>7606</td></tr>
-<tr class="a">
+<td>7612</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>7710</td></tr>
-<tr class="b">
+<td>7716</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>7735</td></tr>
-<tr class="a">
+<td>7741</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7788</td></tr>
-<tr class="b">
+<td>7794</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>7791</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7813</td></tr>
+<td>7797</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7853</td></tr>
+<td>7819</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7854</td></tr>
+<td>7859</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7856</td></tr>
+<td>7860</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>7862</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 110).</td>
-<td>7903</td></tr>
-<tr class="b">
+<td>7909</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 120).</td>
-<td>7904</td></tr>
-<tr class="a">
+<td>7910</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>7911</td></tr>
-<tr class="b">
+<td>7917</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 106).</td>
-<td>7938</td></tr>
-<tr class="a">
+<td>7944</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>8014</td></tr>
-<tr class="b">
+<td>8020</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>8074</td></tr>
-<tr class="a">
+<td>8080</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>8142</td></tr>
-<tr class="b">
+<td>8148</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>8144</td></tr>
-<tr class="a">
+<td>8150</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 one of the following: 12, 14.</td>
-<td>8145</td></tr>
-<tr class="b">
+<td>8151</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>8146</td></tr>
-<tr class="a">
+<td>8152</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>8147</td></tr>
-<tr class="b">
+<td>8153</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>8148</td></tr>
-<tr class="a">
+<td>8154</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>8315</td></tr>
-<tr class="b">
+<td>8321</td></tr>
+<tr class="a">
 <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>8316</td></tr>
-<tr class="a">
+<td>8322</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>8318</td></tr>
-<tr class="b">
+<td>8324</td></tr>
+<tr class="a">
 <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>8319</td></tr>
-<tr class="a">
+<td>8325</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>8329</td></tr>
-<tr class="b">
+<td>8335</td></tr>
+<tr class="a">
 <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>8330</td></tr>
-<tr class="a">
+<td>8336</td></tr>
+<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 6, expected level should be 8.</td>
-<td>8400</td></tr>
-<tr class="b">
+<td>8406</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>8402</td></tr>
-<tr class="a">
+<td>8408</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 12.</td>
-<td>8403</td></tr>
-<tr class="b">
+<td>8409</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>8404</td></tr>
-<tr class="a">
+<td>8410</td></tr>
+<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 8, expected level should be 10.</td>
-<td>8405</td></tr>
-<tr class="b">
+<td>8411</td></tr>
+<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 6, expected level should be 8.</td>
-<td>8406</td></tr>
-<tr class="a">
+<td>8412</td></tr>
+<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 8, expected level should be 10.</td>
-<td>8408</td></tr>
-<tr class="b">
+<td>8414</td></tr>
+<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 6, expected level should be 8.</td>
-<td>8409</td></tr>
-<tr class="a">
+<td>8415</td></tr>
+<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 8, expected level should be 10.</td>
-<td>8411</td></tr>
-<tr class="b">
+<td>8417</td></tr>
+<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 6, expected level should be 8.</td>
-<td>8412</td></tr>
-<tr class="a">
+<td>8418</td></tr>
+<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 6, expected level should be 8.</td>
-<td>8415</td></tr>
-<tr class="b">
+<td>8421</td></tr>
+<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 6, expected level should be 8.</td>
-<td>8418</td></tr>
-<tr class="a">
+<td>8424</td></tr>
+<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 8, expected level should be 10.</td>
-<td>8419</td></tr></table></div>
+<td>8425</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'edu.umd.cs.findbugs.annotations.Nullable' import.</td>
 <td>58</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>'ctor def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>116</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>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>191</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>318</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>329</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>341</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>354</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>358</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>379</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>392</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>432</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>447</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>452</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>517</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>565</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>569</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>593</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>607</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>660</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>734</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>767</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>777</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>779</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>803</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>830</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>832</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>907</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>991</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>1071</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>1074</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>1084</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>1097</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>1098</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>1100</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>1110</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>1125</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>1127</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>1137</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>1160</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>1161</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>1162</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>1165</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>1180</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>
@@ -80681,457 +80675,457 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionServer.java">org/apache/hadoop/hbase/regionserver/HRegionServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'TEST_SKIP_REPORTING_TRANSITION' must be private and have accessor methods.</td>
 <td>239</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'compactSplitThread' must be private and have accessor methods.</td>
 <td>280</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>764</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>773</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>793</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>794</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>799</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>814</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>906</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 223 lines (max allowed is 150).</td>
 <td>929</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>1048</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>1049</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>1050</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>1058</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>1071</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>1159</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>1373</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>1469</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>'initialCountPercentage' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1579</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>1682</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 call' child has incorrect indentation level 16, expected level should be 18.</td>
 <td>1739</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>1768</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>1832</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>'HConstants' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1884</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>'conf' has incorrect indentation level 4, expected level should be 6.</td>
 <td>1898</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>'&quot;hbase.regionserver.wal.max.splitters&quot;' has incorrect indentation level 4, expected level should be 6.</td>
 <td>1919</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 call' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1934</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>1939</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>1940</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>1941</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>1942</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>1943</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>1944</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>1945</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 call' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1950</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>2033</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>2046</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>2304</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>2460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2476</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2582</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>2596</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>2598</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>2685</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>2690</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>3005</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>3006</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>3043</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 5, expected level should be 4.</td>
 <td>3048</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>'synchronized' has incorrect indentation level 5, expected level should be 4.</td>
 <td>3049</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>'for' has incorrect indentation level 7, expected level should be 6.</td>
 <td>3050</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>'for' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>3051</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>'if' has incorrect indentation level 9, expected level should be 8.</td>
 <td>3052</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>'if' child has incorrect indentation level 11, expected level should be 10.</td>
 <td>3053</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>'if rcurly' has incorrect indentation level 9, expected level should be 8.</td>
 <td>3054</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>'for rcurly' has incorrect indentation level 7, expected level should be 6.</td>
 <td>3055</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>'synchronized rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>3056</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 5, expected level should be 4.</td>
 <td>3057</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>3058</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>3209</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>3242</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>3269</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>3283</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>3391</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>'ctor def rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>3413</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>3485</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 48 should have line break after.</td>
 <td>3506</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 46 should have line break after.</td>
 <td>3507</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>3554</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>3574</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>'if' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>3576</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>'if' child has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
 <td>3577</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>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>3578</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 rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>3579</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>
@@ -81140,19 +81134,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.java">org/apache/hadoop/hbase/regionserver/HRegionServerCommandLine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>25</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>
@@ -81161,265 +81155,265 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HStore.java">org/apache/hadoop/hbase/regionserver/HStore.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>133</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>236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>239</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>240</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>387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>510</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>522</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>546</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 113).</td>
 <td>561</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>585</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>587</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>621</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>636</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>642</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>643</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>644</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>'if' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>839</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 call' child has incorrect indentation level 9, expected level should be 10.</td>
 <td>840</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 9, expected level should be 10.</td>
 <td>841</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>844</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>852</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>964</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>970</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>998</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>999</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>1000</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>1052</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>1053</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>1055</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>1078</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>1147</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>1148</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>1180</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>1375</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>1441</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 114).</td>
 <td>1480</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>1584</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>1827</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>2039</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>2232</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>2346</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>2378</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>
@@ -81428,43 +81422,43 @@
 <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">
-<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.

<TRUNCATED>

[09/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span clas

<TRUNCATED>

[25/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 974cc13..3d6d0fa 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/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/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/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/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/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/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/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/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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/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/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/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 6316995..42fb00b 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -219,11 +219,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/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>
 <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/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/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/67e3bccd/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 ab1494d..bddad32 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -231,11 +231,11 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/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/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/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
index b5220bc..9a50123 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html?is-external=true" title="class or interface in java.lang">@FunctionalInterface</a>
-public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3051">HRegion.BatchOperation.Visitor</a></pre>
+public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3057">HRegion.BatchOperation.Visitor</a></pre>
 <div class="block">Visitor interface for batch operations</div>
 </li>
 </ul>
@@ -155,7 +155,7 @@ public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase
 <ul class="blockListLast">
 <li class="blockList">
 <h4>visit</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html#line.3056">visit</a>(int&nbsp;index)
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html#line.3062">visit</a>(int&nbsp;index)
        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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
index 2260cb8..004582f 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3021">HRegion.BatchOperation</a>&lt;T&gt;
+<pre>private abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3027">HRegion.BatchOperation</a>&lt;T&gt;
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Class that tracks the progress of a batch operations, accumulating status codes and tracking
  the index at which processing is proceeding. These batch operations may get split into
@@ -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>operations</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="type parameter in HRegion.BatchOperation">T</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3022">operations</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="type parameter in HRegion.BatchOperation">T</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3028">operations</a></pre>
 </li>
 </ul>
 <a name="retCodeDetails">
@@ -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>retCodeDetails</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3023">retCodeDetails</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3029">retCodeDetails</a></pre>
 </li>
 </ul>
 <a name="walEditsFromCoprocessors">
@@ -426,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>walEditsFromCoprocessors</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3024">walEditsFromCoprocessors</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3030">walEditsFromCoprocessors</a></pre>
 </li>
 </ul>
 <a name="familyCellMaps">
@@ -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>familyCellMaps</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3026">familyCellMaps</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3032">familyCellMaps</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -444,7 +444,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3028">region</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3034">region</a></pre>
 </li>
 </ul>
 <a name="nextIndexToProcess">
@@ -453,7 +453,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nextIndexToProcess</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3029">nextIndexToProcess</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3035">nextIndexToProcess</a></pre>
 </li>
 </ul>
 <a name="observedExceptions">
@@ -462,7 +462,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>observedExceptions</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.ObservedExceptionsInBatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3030">observedExceptions</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.ObservedExceptionsInBatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3036">observedExceptions</a></pre>
 </li>
 </ul>
 <a name="durability">
@@ -471,7 +471,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>durability</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3032">durability</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3038">durability</a></pre>
 </li>
 </ul>
 <a name="atomic">
@@ -480,7 +480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>atomic</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3033">atomic</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3039">atomic</a></pre>
 </li>
 </ul>
 </li>
@@ -499,7 +499,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BatchOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3035">BatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3041">BatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                       <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="type parameter in HRegion.BatchOperation">T</a>[]&nbsp;operations)</pre>
 </li>
 </ul>
@@ -517,7 +517,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>visitBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3062">visitBatchOperations</a>(boolean&nbsp;pendingOnly,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3068">visitBatchOperations</a>(boolean&nbsp;pendingOnly,
                                  int&nbsp;lastIndexExclusive,
                                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation.Visitor</a>&nbsp;visitor)
                           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>
@@ -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>getMutation</h4>
-<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3074">getMutation</a>(int&nbsp;index)</pre>
+<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3080">getMutation</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getNonceGroup-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>getNonceGroup</h4>
-<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3076">getNonceGroup</a>(int&nbsp;index)</pre>
+<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3082">getNonceGroup</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getNonce-int-">
@@ -552,7 +552,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3078">getNonce</a>(int&nbsp;index)</pre>
+<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3084">getNonce</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getMutationsForCoprocs--">
@@ -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>getMutationsForCoprocs</h4>
-<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3083">getMutationsForCoprocs</a>()</pre>
+<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3089">getMutationsForCoprocs</a>()</pre>
 <div class="block">This method is potentially expensive and useful mostly for non-replay CP path.</div>
 </li>
 </ul>
@@ -571,7 +571,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isInReplay</h4>
-<pre>public abstract&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3085">isInReplay</a>()</pre>
+<pre>public abstract&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3091">isInReplay</a>()</pre>
 </li>
 </ul>
 <a name="getOrigLogSeqNum--">
@@ -580,7 +580,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3087">getOrigLogSeqNum</a>()</pre>
+<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3093">getOrigLogSeqNum</a>()</pre>
 </li>
 </ul>
 <a name="startRegionOperation--">
@@ -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>startRegionOperation</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3089">startRegionOperation</a>()
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3095">startRegionOperation</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>
@@ -603,7 +603,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3091">closeRegionOperation</a>()
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3097">closeRegionOperation</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>
@@ -617,7 +617,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepare</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3100">checkAndPrepare</a>()
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3106">checkAndPrepare</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">Validates each mutation and prepares a batch for write. If necessary (non-replay case), runs
  CP prePut()/ preDelete() hooks for all mutations in a batch. This is intended to operate on
@@ -636,7 +636,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPreparePut</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3106">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3112">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                                     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">Implement any Put request specific check and prepare logic here. Please refer to
  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPrepareMutation-org.apache.hadoop.hbase.client.Mutation-long-"><code>checkAndPrepareMutation(Mutation, long)</code></a> for how its used.</div>
@@ -652,7 +652,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareMiniBatchOperations</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3112">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3118">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                 long&nbsp;timestamp,
                                                 <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/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                          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>
@@ -670,7 +670,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3118">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3124">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                                                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                                                                       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">Write mini-batch operations to MemStore</div>
@@ -686,7 +686,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3122">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3128">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                   long&nbsp;writeNumber)
                                            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>
@@ -701,7 +701,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3142">isDone</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3148">isDone</a>()</pre>
 </li>
 </ul>
 <a name="size--">
@@ -710,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>size</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3146">size</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3152">size</a>()</pre>
 </li>
 </ul>
 <a name="isOperationPending-int-">
@@ -719,7 +719,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isOperationPending</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3150">isOperationPending</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3156">isOperationPending</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getClusterIds--">
@@ -728,7 +728,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterIds</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="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3154">getClusterIds</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="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3160">getClusterIds</a>()</pre>
 </li>
 </ul>
 <a name="isAtomic--">
@@ -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>isAtomic</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3159">isAtomic</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3165">isAtomic</a>()</pre>
 </li>
 </ul>
 <a name="checkAndPrepareMutation-org.apache.hadoop.hbase.client.Mutation-long-">
@@ -746,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>checkAndPrepareMutation</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3169">checkAndPrepareMutation</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3175">checkAndPrepareMutation</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                                        long&nbsp;timestamp)
                                 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">Helper method that checks and prepares only one mutation. This can be used to implement
@@ -765,7 +765,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepareMutation</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3181">checkAndPrepareMutation</a>(int&nbsp;index,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3187">checkAndPrepareMutation</a>(int&nbsp;index,
                                        long&nbsp;timestamp)
                                 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>
@@ -780,7 +780,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lockRowsAndBuildMiniBatch</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3243">lockRowsAndBuildMiniBatch</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/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3249">lockRowsAndBuildMiniBatch</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/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                                                  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">Creates Mini-batch of all operations [nextIndexToProcess, lastIndexExclusive) for which
  a row lock can be acquired. All mutations with locked rows are considered to be
@@ -800,7 +800,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createMiniBatch</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3327">createMiniBatch</a>(int&nbsp;lastIndexExclusive,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3333">createMiniBatch</a>(int&nbsp;lastIndexExclusive,
                                                                  int&nbsp;readyToWriteCount)</pre>
 </li>
 </ul>
@@ -810,7 +810,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>buildWALEdits</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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3337">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;m
 iniBatchOp)
+<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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3343">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;m
 iniBatchOp)
                                            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">Builds separate WALEdit per nonce by applying input mutations. If WALEdits from CP are
  present, they are merged to result WALEdit.</div>
@@ -826,7 +826,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>completeMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3386">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3392">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                  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 method completes mini-batch operations by calling postBatchMutate() CP hook (if
@@ -843,7 +843,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>doPostOpCleanupForMiniBatch</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3394">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3400">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit,
                                         boolean&nbsp;success)
                                  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>
@@ -859,7 +859,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>doFinishHotnessProtector</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3400">doFinishHotnessProtector</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3406">doFinishHotnessProtector</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp)</pre>
 </li>
 </ul>
 <a name="applyFamilyMapToMemStore-java.util.Map-org.apache.hadoop.hbase.regionserver.MemStoreSizing-">
@@ -868,7 +868,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>applyFamilyMapToMemStore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3437">applyFamilyMapToMemStore</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3443">applyFamilyMapToMemStore</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreAccounting)
                                  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">Atomically apply the given map of family->edits to the memstore.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
index f0d2759..335ea7a 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5961">HRegion.BulkLoadListener</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5967">HRegion.BulkLoadListener</a></pre>
 <div class="block">Listener class to enable callers of
  bulkLoadHFile() to perform any necessary
  pre/post processing of a given bulkload call</div>
@@ -174,7 +174,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareBulkLoad</h4>
-<pre><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/HRegion.BulkLoadListener.html#line.5969">prepareBulkLoad</a>(byte[]&nbsp;family,
+<pre><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/HRegion.BulkLoadListener.html#line.5975">prepareBulkLoad</a>(byte[]&nbsp;family,
                        <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;srcPath,
                        boolean&nbsp;copyFile)
                 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>
@@ -196,7 +196,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>doneBulkLoad</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5978">doneBulkLoad</a>(byte[]&nbsp;family,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5984">doneBulkLoad</a>(byte[]&nbsp;family,
                   <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;srcPath)
            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">Called after a successful HFile load</div>
@@ -215,7 +215,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>failedBulkLoad</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5986">failedBulkLoad</a>(byte[]&nbsp;family,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5992">failedBulkLoad</a>(byte[]&nbsp;family,
                     <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;srcPath)
              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">Called after a failed HFile load</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
index dd6b89a..3b9a125 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2192">HRegion.FlushResult.Result</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2196">HRegion.FlushResult.Result</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&gt;</pre>
 </li>
 </ul>
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>FLUSHED_NO_COMPACTION_NEEDED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2193">FLUSHED_NO_COMPACTION_NEEDED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2197">FLUSHED_NO_COMPACTION_NEEDED</a></pre>
 </li>
 </ul>
 <a name="FLUSHED_COMPACTION_NEEDED">
@@ -225,7 +225,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>FLUSHED_COMPACTION_NEEDED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2194">FLUSHED_COMPACTION_NEEDED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2198">FLUSHED_COMPACTION_NEEDED</a></pre>
 </li>
 </ul>
 <a name="CANNOT_FLUSH_MEMSTORE_EMPTY">
@@ -234,7 +234,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>CANNOT_FLUSH_MEMSTORE_EMPTY</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2197">CANNOT_FLUSH_MEMSTORE_EMPTY</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2201">CANNOT_FLUSH_MEMSTORE_EMPTY</a></pre>
 </li>
 </ul>
 <a name="CANNOT_FLUSH">
@@ -243,7 +243,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CANNOT_FLUSH</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2198">CANNOT_FLUSH</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2202">CANNOT_FLUSH</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
index 3a9dc8b..a69ff4e 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2191">HRegion.FlushResult</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2195">HRegion.FlushResult</a></pre>
 </li>
 </ul>
 </div>
@@ -180,7 +180,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>getResult</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2202">getResult</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2206">getResult</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the detailed result code</dd>
@@ -193,7 +193,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>isFlushSucceeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2205">isFlushSucceeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2209">isFlushSucceeded</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if the memstores were flushed, else false</dd>
@@ -206,7 +206,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isCompactionNeeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2208">isCompactionNeeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2212">isCompactionNeeded</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if the flush requested a compaction, else false</dd>


[05/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>       

<TRUNCATED>

[17/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.25

<TRUNCATED>

[20/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html
index 9dc713d..9aa9b59 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html
@@ -342,205 +342,206 @@
 <span class="sourceLineNo">334</span><a name="line.334"></a>
 <span class="sourceLineNo">335</span>  private HRegionLocation locateRowBeforeInCache(TableCache tableCache, TableName tableName,<a name="line.335"></a>
 <span class="sourceLineNo">336</span>      byte[] row) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    Map.Entry&lt;byte[], HRegionLocation&gt; entry =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      isEmptyStopRow(row) ? tableCache.cache.lastEntry() : tableCache.cache.lowerEntry(row);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    if (entry == null) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      return null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    HRegionLocation loc = entry.getValue();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (isEmptyStopRow(loc.getRegion().getEndKey()) ||<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      Bytes.compareTo(loc.getRegion().getEndKey(), row) &gt;= 0) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      if (LOG.isTraceEnabled()) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        LOG.trace("Found " + loc + " in cache for '" + tableName + "', row='" +<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          Bytes.toStringBinary(row) + "', locateType=" + RegionLocateType.BEFORE);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      return loc;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    } else {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      return null;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private void locateInMeta(TableName tableName, LocateRequest req) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    if (LOG.isTraceEnabled()) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.trace("Try locate '" + tableName + "', row='" + Bytes.toStringBinary(req.row) +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        "', locateType=" + req.locateType + " in meta");<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[] metaStartKey;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    if (req.locateType.equals(RegionLocateType.BEFORE)) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      if (isEmptyStopRow(req.row)) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        byte[] binaryTableName = tableName.getName();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        metaStartKey = Arrays.copyOf(binaryTableName, binaryTableName.length + 1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      } else {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        metaStartKey = createRegionName(tableName, req.row, ZEROES, false);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    } else {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      metaStartKey = createRegionName(tableName, req.row, NINES, false);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    byte[] metaStopKey =<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      RegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW, "", false);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    conn.getTable(META_TABLE_NAME)<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      .scan(new Scan().withStartRow(metaStartKey).withStopRow(metaStopKey, true)<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        .addFamily(HConstants.CATALOG_FAMILY).setReversed(true).setCaching(locatePrefetchLimit)<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        .setReadType(ReadType.PREAD), new AdvancedScanResultConsumer() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>          private boolean completeNormally = false;<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>          private boolean tableNotFound = true;<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>          @Override<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          public void onError(Throwable error) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>            complete(tableName, req, null, error);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>          @Override<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          public void onComplete() {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>            if (tableNotFound) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>              complete(tableName, req, null, new TableNotFoundException(tableName));<a name="line.390"></a>
-<span class="sourceLineNo">391</span>            } else if (!completeNormally) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>              complete(tableName, req, null, new IOException(<a name="line.392"></a>
-<span class="sourceLineNo">393</span>                "Unable to find region for " + Bytes.toStringBinary(req.row) + " in " + tableName));<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><a name="line.396"></a>
-<span class="sourceLineNo">397</span>          @Override<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          public void onNext(Result[] results, ScanController controller) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            if (results.length == 0) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>              return;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            tableNotFound = false;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>            int i = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>            for (; i &lt; results.length; i++) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>              if (onScanNext(tableName, req, results[i])) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                completeNormally = true;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                controller.terminate();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                i++;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                break;<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            // Add the remaining results into cache<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            if (i &lt; results.length) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>              TableCache tableCache = getTableCache(tableName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              for (; i &lt; results.length; i++) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                RegionLocations locs = MetaTableAccessor.getRegionLocations(results[i]);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                if (locs == null) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                  continue;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                HRegionLocation loc = locs.getDefaultRegionLocation();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                if (loc == null) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>                  continue;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                RegionInfo info = loc.getRegion();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                if (info == null || info.isOffline() || info.isSplitParent() ||<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                  loc.getServerName() == null) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                  continue;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                if (addToCache(tableCache, loc)) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                  synchronized (tableCache) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                    tableCache.clearCompletedRequests(Optional.of(loc));<a name="line.431"></a>
-<span class="sourceLineNo">432</span>                  }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>                }<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            }<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        });<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private HRegionLocation locateInCache(TableCache tableCache, TableName tableName, byte[] row,<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      RegionLocateType locateType) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return locateType.equals(RegionLocateType.BEFORE)<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      ? locateRowBeforeInCache(tableCache, tableName, row)<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      : locateRowInCache(tableCache, tableName, row);<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>  // locateToPrevious is true means we will use the start key of a region to locate the region<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  // placed before it. Used for reverse scan. See the comment of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  // AsyncRegionLocator.getPreviousRegionLocation.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  private CompletableFuture&lt;HRegionLocation&gt; getRegionLocationInternal(TableName tableName,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      byte[] row, RegionLocateType locateType, boolean reload) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // AFTER should be convert to CURRENT before calling this method<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    assert !locateType.equals(RegionLocateType.AFTER);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    TableCache tableCache = getTableCache(tableName);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    if (!reload) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      if (loc != null) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        return CompletableFuture.completedFuture(loc);<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>    CompletableFuture&lt;HRegionLocation&gt; future;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    LocateRequest req;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    boolean sendRequest = false;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    synchronized (tableCache) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // check again<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (!reload) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        if (loc != null) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          return CompletableFuture.completedFuture(loc);<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>      req = new LocateRequest(row, locateType);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      future = tableCache.allRequests.get(req);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      if (future == null) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        future = new CompletableFuture&lt;&gt;();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        tableCache.allRequests.put(req, future);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        if (tableCache.hasQuota(maxConcurrentLocateRequestPerTable) &amp;&amp; !tableCache.isPending(req)) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          tableCache.send(req);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          sendRequest = true;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    if (sendRequest) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      locateInMeta(tableName, req);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return future;<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>  CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, byte[] row,<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      RegionLocateType locateType, boolean reload) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    if (locateType.equals(RegionLocateType.BEFORE)) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      return getRegionLocationInternal(tableName, row, locateType, reload);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    } else {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // as we know the exact row after us, so we can just create the new row, and use the same<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      // algorithm to locate it.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (locateType.equals(RegionLocateType.AFTER)) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        row = createClosestRowAfter(row);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      return getRegionLocationInternal(tableName, row, RegionLocateType.CURRENT, reload);<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>  void updateCachedLocation(HRegionLocation loc, Throwable exception) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    AsyncRegionLocator.updateCachedLocation(loc, exception, l -&gt; {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      TableCache tableCache = cache.get(l.getRegion().getTable());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      if (tableCache == null) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        return null;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      }<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return tableCache.cache.get(l.getRegion().getStartKey());<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }, this::addToCache, this::removeFromCache);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  void clearCache(TableName tableName) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    TableCache tableCache = cache.remove(tableName);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if (tableCache == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      return;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    synchronized (tableCache) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      if (!tableCache.allRequests.isEmpty()) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        IOException error = new IOException("Cache cleared");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        tableCache.allRequests.values().forEach(f -&gt; f.completeExceptionally(error));<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>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // only used for testing whether we have cached the location for a region.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  @VisibleForTesting<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  HRegionLocation getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableCache tableCache = cache.get(tableName);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    if (tableCache == null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return null;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    return locateRowInCache(tableCache, tableName, row);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>}<a name="line.535"></a>
+<span class="sourceLineNo">337</span>    boolean isEmptyStopRow = isEmptyStopRow(row);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    Map.Entry&lt;byte[], HRegionLocation&gt; entry =<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        isEmptyStopRow ? tableCache.cache.lastEntry() : tableCache.cache.lowerEntry(row);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (entry == null) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      return null;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    HRegionLocation loc = entry.getValue();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    if (isEmptyStopRow(loc.getRegion().getEndKey()) ||<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      (!isEmptyStopRow &amp;&amp; Bytes.compareTo(loc.getRegion().getEndKey(), row) &gt;= 0)) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (LOG.isTraceEnabled()) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("Found " + loc + " in cache for '" + tableName + "', row='" +<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          Bytes.toStringBinary(row) + "', locateType=" + RegionLocateType.BEFORE);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      return loc;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    } else {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      return null;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  private void locateInMeta(TableName tableName, LocateRequest req) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    if (LOG.isTraceEnabled()) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      LOG.trace("Try locate '" + tableName + "', row='" + Bytes.toStringBinary(req.row) +<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        "', locateType=" + req.locateType + " in meta");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    byte[] metaStartKey;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (req.locateType.equals(RegionLocateType.BEFORE)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      if (isEmptyStopRow(req.row)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        byte[] binaryTableName = tableName.getName();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        metaStartKey = Arrays.copyOf(binaryTableName, binaryTableName.length + 1);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      } else {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        metaStartKey = createRegionName(tableName, req.row, ZEROES, false);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    } else {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      metaStartKey = createRegionName(tableName, req.row, NINES, false);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    byte[] metaStopKey =<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      RegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW, "", false);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    conn.getTable(META_TABLE_NAME)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      .scan(new Scan().withStartRow(metaStartKey).withStopRow(metaStopKey, true)<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        .addFamily(HConstants.CATALOG_FAMILY).setReversed(true).setCaching(locatePrefetchLimit)<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        .setReadType(ReadType.PREAD), new AdvancedScanResultConsumer() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>          private boolean completeNormally = false;<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>          private boolean tableNotFound = true;<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>          public void onError(Throwable error) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>            complete(tableName, req, null, error);<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>          @Override<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          public void onComplete() {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            if (tableNotFound) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>              complete(tableName, req, null, new TableNotFoundException(tableName));<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            } else if (!completeNormally) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>              complete(tableName, req, null, new IOException(<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                "Unable to find region for " + Bytes.toStringBinary(req.row) + " in " + tableName));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>            }<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>          @Override<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          public void onNext(Result[] results, ScanController controller) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            if (results.length == 0) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>              return;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            tableNotFound = false;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            int i = 0;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            for (; i &lt; results.length; i++) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>              if (onScanNext(tableName, req, results[i])) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>                completeNormally = true;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>                controller.terminate();<a name="line.408"></a>
+<span class="sourceLineNo">409</span>                i++;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>                break;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>              }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            // Add the remaining results into cache<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            if (i &lt; results.length) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>              TableCache tableCache = getTableCache(tableName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>              for (; i &lt; results.length; i++) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>                RegionLocations locs = MetaTableAccessor.getRegionLocations(results[i]);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                if (locs == null) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                  continue;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>                }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>                HRegionLocation loc = locs.getDefaultRegionLocation();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>                if (loc == null) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>                  continue;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>                }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>                RegionInfo info = loc.getRegion();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                if (info == null || info.isOffline() || info.isSplitParent() ||<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                  loc.getServerName() == null) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>                  continue;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>                }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>                if (addToCache(tableCache, loc)) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  synchronized (tableCache) {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                    tableCache.clearCompletedRequests(Optional.of(loc));<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>                }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>              }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        });<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>  private HRegionLocation locateInCache(TableCache tableCache, TableName tableName, byte[] row,<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      RegionLocateType locateType) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return locateType.equals(RegionLocateType.BEFORE)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      ? locateRowBeforeInCache(tableCache, tableName, row)<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      : locateRowInCache(tableCache, tableName, row);<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>  // locateToPrevious is true means we will use the start key of a region to locate the region<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  // placed before it. Used for reverse scan. See the comment of<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  // AsyncRegionLocator.getPreviousRegionLocation.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  private CompletableFuture&lt;HRegionLocation&gt; getRegionLocationInternal(TableName tableName,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      byte[] row, RegionLocateType locateType, boolean reload) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    // AFTER should be convert to CURRENT before calling this method<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    assert !locateType.equals(RegionLocateType.AFTER);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    TableCache tableCache = getTableCache(tableName);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    if (!reload) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      if (loc != null) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>        return CompletableFuture.completedFuture(loc);<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>    CompletableFuture&lt;HRegionLocation&gt; future;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    LocateRequest req;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    boolean sendRequest = false;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    synchronized (tableCache) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      // check again<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      if (!reload) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        if (loc != null) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>          return CompletableFuture.completedFuture(loc);<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>      req = new LocateRequest(row, locateType);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      future = tableCache.allRequests.get(req);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      if (future == null) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        future = new CompletableFuture&lt;&gt;();<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        tableCache.allRequests.put(req, future);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        if (tableCache.hasQuota(maxConcurrentLocateRequestPerTable) &amp;&amp; !tableCache.isPending(req)) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>          tableCache.send(req);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          sendRequest = true;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    if (sendRequest) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      locateInMeta(tableName, req);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    return future;<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>  CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, byte[] row,<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      RegionLocateType locateType, boolean reload) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    if (locateType.equals(RegionLocateType.BEFORE)) {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      return getRegionLocationInternal(tableName, row, locateType, reload);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    } else {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      // as we know the exact row after us, so we can just create the new row, and use the same<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      // algorithm to locate it.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      if (locateType.equals(RegionLocateType.AFTER)) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        row = createClosestRowAfter(row);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      return getRegionLocationInternal(tableName, row, RegionLocateType.CURRENT, reload);<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><a name="line.503"></a>
+<span class="sourceLineNo">504</span>  void updateCachedLocation(HRegionLocation loc, Throwable exception) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    AsyncRegionLocator.updateCachedLocation(loc, exception, l -&gt; {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      TableCache tableCache = cache.get(l.getRegion().getTable());<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      if (tableCache == null) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        return null;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      return tableCache.cache.get(l.getRegion().getStartKey());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    }, this::addToCache, this::removeFromCache);<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>  void clearCache(TableName tableName) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    TableCache tableCache = cache.remove(tableName);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    if (tableCache == null) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      return;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    synchronized (tableCache) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      if (!tableCache.allRequests.isEmpty()) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        IOException error = new IOException("Cache cleared");<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        tableCache.allRequests.values().forEach(f -&gt; f.completeExceptionally(error));<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      }<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><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  // only used for testing whether we have cached the location for a region.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  @VisibleForTesting<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  HRegionLocation getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    TableCache tableCache = cache.get(tableName);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (tableCache == null) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      return null;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return locateRowInCache(tableCache, tableName, row);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>}<a name="line.536"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
index 9dc713d..9aa9b59 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
@@ -342,205 +342,206 @@
 <span class="sourceLineNo">334</span><a name="line.334"></a>
 <span class="sourceLineNo">335</span>  private HRegionLocation locateRowBeforeInCache(TableCache tableCache, TableName tableName,<a name="line.335"></a>
 <span class="sourceLineNo">336</span>      byte[] row) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    Map.Entry&lt;byte[], HRegionLocation&gt; entry =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      isEmptyStopRow(row) ? tableCache.cache.lastEntry() : tableCache.cache.lowerEntry(row);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    if (entry == null) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      return null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    HRegionLocation loc = entry.getValue();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (isEmptyStopRow(loc.getRegion().getEndKey()) ||<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      Bytes.compareTo(loc.getRegion().getEndKey(), row) &gt;= 0) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      if (LOG.isTraceEnabled()) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        LOG.trace("Found " + loc + " in cache for '" + tableName + "', row='" +<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          Bytes.toStringBinary(row) + "', locateType=" + RegionLocateType.BEFORE);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      return loc;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    } else {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      return null;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private void locateInMeta(TableName tableName, LocateRequest req) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    if (LOG.isTraceEnabled()) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.trace("Try locate '" + tableName + "', row='" + Bytes.toStringBinary(req.row) +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        "', locateType=" + req.locateType + " in meta");<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[] metaStartKey;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    if (req.locateType.equals(RegionLocateType.BEFORE)) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      if (isEmptyStopRow(req.row)) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        byte[] binaryTableName = tableName.getName();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        metaStartKey = Arrays.copyOf(binaryTableName, binaryTableName.length + 1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      } else {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        metaStartKey = createRegionName(tableName, req.row, ZEROES, false);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    } else {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      metaStartKey = createRegionName(tableName, req.row, NINES, false);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    byte[] metaStopKey =<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      RegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW, "", false);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    conn.getTable(META_TABLE_NAME)<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      .scan(new Scan().withStartRow(metaStartKey).withStopRow(metaStopKey, true)<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        .addFamily(HConstants.CATALOG_FAMILY).setReversed(true).setCaching(locatePrefetchLimit)<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        .setReadType(ReadType.PREAD), new AdvancedScanResultConsumer() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>          private boolean completeNormally = false;<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>          private boolean tableNotFound = true;<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>          @Override<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          public void onError(Throwable error) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>            complete(tableName, req, null, error);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>          @Override<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          public void onComplete() {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>            if (tableNotFound) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>              complete(tableName, req, null, new TableNotFoundException(tableName));<a name="line.390"></a>
-<span class="sourceLineNo">391</span>            } else if (!completeNormally) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>              complete(tableName, req, null, new IOException(<a name="line.392"></a>
-<span class="sourceLineNo">393</span>                "Unable to find region for " + Bytes.toStringBinary(req.row) + " in " + tableName));<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><a name="line.396"></a>
-<span class="sourceLineNo">397</span>          @Override<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          public void onNext(Result[] results, ScanController controller) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            if (results.length == 0) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>              return;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            tableNotFound = false;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>            int i = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>            for (; i &lt; results.length; i++) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>              if (onScanNext(tableName, req, results[i])) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                completeNormally = true;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                controller.terminate();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                i++;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                break;<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            // Add the remaining results into cache<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            if (i &lt; results.length) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>              TableCache tableCache = getTableCache(tableName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              for (; i &lt; results.length; i++) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                RegionLocations locs = MetaTableAccessor.getRegionLocations(results[i]);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                if (locs == null) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                  continue;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                HRegionLocation loc = locs.getDefaultRegionLocation();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                if (loc == null) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>                  continue;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                RegionInfo info = loc.getRegion();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                if (info == null || info.isOffline() || info.isSplitParent() ||<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                  loc.getServerName() == null) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                  continue;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                if (addToCache(tableCache, loc)) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                  synchronized (tableCache) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                    tableCache.clearCompletedRequests(Optional.of(loc));<a name="line.431"></a>
-<span class="sourceLineNo">432</span>                  }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>                }<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            }<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        });<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private HRegionLocation locateInCache(TableCache tableCache, TableName tableName, byte[] row,<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      RegionLocateType locateType) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return locateType.equals(RegionLocateType.BEFORE)<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      ? locateRowBeforeInCache(tableCache, tableName, row)<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      : locateRowInCache(tableCache, tableName, row);<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>  // locateToPrevious is true means we will use the start key of a region to locate the region<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  // placed before it. Used for reverse scan. See the comment of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  // AsyncRegionLocator.getPreviousRegionLocation.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  private CompletableFuture&lt;HRegionLocation&gt; getRegionLocationInternal(TableName tableName,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      byte[] row, RegionLocateType locateType, boolean reload) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // AFTER should be convert to CURRENT before calling this method<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    assert !locateType.equals(RegionLocateType.AFTER);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    TableCache tableCache = getTableCache(tableName);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    if (!reload) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      if (loc != null) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        return CompletableFuture.completedFuture(loc);<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>    CompletableFuture&lt;HRegionLocation&gt; future;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    LocateRequest req;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    boolean sendRequest = false;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    synchronized (tableCache) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // check again<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (!reload) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        if (loc != null) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          return CompletableFuture.completedFuture(loc);<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>      req = new LocateRequest(row, locateType);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      future = tableCache.allRequests.get(req);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      if (future == null) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        future = new CompletableFuture&lt;&gt;();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        tableCache.allRequests.put(req, future);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        if (tableCache.hasQuota(maxConcurrentLocateRequestPerTable) &amp;&amp; !tableCache.isPending(req)) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          tableCache.send(req);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          sendRequest = true;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    if (sendRequest) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      locateInMeta(tableName, req);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return future;<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>  CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, byte[] row,<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      RegionLocateType locateType, boolean reload) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    if (locateType.equals(RegionLocateType.BEFORE)) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      return getRegionLocationInternal(tableName, row, locateType, reload);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    } else {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // as we know the exact row after us, so we can just create the new row, and use the same<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      // algorithm to locate it.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (locateType.equals(RegionLocateType.AFTER)) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        row = createClosestRowAfter(row);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      return getRegionLocationInternal(tableName, row, RegionLocateType.CURRENT, reload);<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>  void updateCachedLocation(HRegionLocation loc, Throwable exception) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    AsyncRegionLocator.updateCachedLocation(loc, exception, l -&gt; {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      TableCache tableCache = cache.get(l.getRegion().getTable());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      if (tableCache == null) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        return null;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      }<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return tableCache.cache.get(l.getRegion().getStartKey());<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }, this::addToCache, this::removeFromCache);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  void clearCache(TableName tableName) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    TableCache tableCache = cache.remove(tableName);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if (tableCache == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      return;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    synchronized (tableCache) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      if (!tableCache.allRequests.isEmpty()) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        IOException error = new IOException("Cache cleared");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        tableCache.allRequests.values().forEach(f -&gt; f.completeExceptionally(error));<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>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // only used for testing whether we have cached the location for a region.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  @VisibleForTesting<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  HRegionLocation getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableCache tableCache = cache.get(tableName);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    if (tableCache == null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return null;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    return locateRowInCache(tableCache, tableName, row);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>}<a name="line.535"></a>
+<span class="sourceLineNo">337</span>    boolean isEmptyStopRow = isEmptyStopRow(row);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    Map.Entry&lt;byte[], HRegionLocation&gt; entry =<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        isEmptyStopRow ? tableCache.cache.lastEntry() : tableCache.cache.lowerEntry(row);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (entry == null) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      return null;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    HRegionLocation loc = entry.getValue();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    if (isEmptyStopRow(loc.getRegion().getEndKey()) ||<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      (!isEmptyStopRow &amp;&amp; Bytes.compareTo(loc.getRegion().getEndKey(), row) &gt;= 0)) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (LOG.isTraceEnabled()) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("Found " + loc + " in cache for '" + tableName + "', row='" +<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          Bytes.toStringBinary(row) + "', locateType=" + RegionLocateType.BEFORE);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      return loc;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    } else {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      return null;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  private void locateInMeta(TableName tableName, LocateRequest req) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    if (LOG.isTraceEnabled()) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      LOG.trace("Try locate '" + tableName + "', row='" + Bytes.toStringBinary(req.row) +<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        "', locateType=" + req.locateType + " in meta");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    byte[] metaStartKey;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (req.locateType.equals(RegionLocateType.BEFORE)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      if (isEmptyStopRow(req.row)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        byte[] binaryTableName = tableName.getName();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        metaStartKey = Arrays.copyOf(binaryTableName, binaryTableName.length + 1);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      } else {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        metaStartKey = createRegionName(tableName, req.row, ZEROES, false);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    } else {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      metaStartKey = createRegionName(tableName, req.row, NINES, false);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    byte[] metaStopKey =<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      RegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW, "", false);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    conn.getTable(META_TABLE_NAME)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      .scan(new Scan().withStartRow(metaStartKey).withStopRow(metaStopKey, true)<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        .addFamily(HConstants.CATALOG_FAMILY).setReversed(true).setCaching(locatePrefetchLimit)<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        .setReadType(ReadType.PREAD), new AdvancedScanResultConsumer() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>          private boolean completeNormally = false;<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>          private boolean tableNotFound = true;<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>          public void onError(Throwable error) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>            complete(tableName, req, null, error);<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>          @Override<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          public void onComplete() {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            if (tableNotFound) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>              complete(tableName, req, null, new TableNotFoundException(tableName));<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            } else if (!completeNormally) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>              complete(tableName, req, null, new IOException(<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                "Unable to find region for " + Bytes.toStringBinary(req.row) + " in " + tableName));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>            }<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>          @Override<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          public void onNext(Result[] results, ScanController controller) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            if (results.length == 0) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>              return;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            tableNotFound = false;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            int i = 0;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            for (; i &lt; results.length; i++) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>              if (onScanNext(tableName, req, results[i])) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>                completeNormally = true;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>                controller.terminate();<a name="line.408"></a>
+<span class="sourceLineNo">409</span>                i++;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>                break;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>              }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            // Add the remaining results into cache<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            if (i &lt; results.length) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>              TableCache tableCache = getTableCache(tableName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>              for (; i &lt; results.length; i++) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>                RegionLocations locs = MetaTableAccessor.getRegionLocations(results[i]);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                if (locs == null) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                  continue;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>                }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>                HRegionLocation loc = locs.getDefaultRegionLocation();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>                if (loc == null) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>                  continue;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>                }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>                RegionInfo info = loc.getRegion();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                if (info == null || info.isOffline() || info.isSplitParent() ||<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                  loc.getServerName() == null) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>                  continue;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>                }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>                if (addToCache(tableCache, loc)) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  synchronized (tableCache) {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                    tableCache.clearCompletedRequests(Optional.of(loc));<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>                }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>              }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        });<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>  private HRegionLocation locateInCache(TableCache tableCache, TableName tableName, byte[] row,<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      RegionLocateType locateType) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return locateType.equals(RegionLocateType.BEFORE)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      ? locateRowBeforeInCache(tableCache, tableName, row)<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      : locateRowInCache(tableCache, tableName, row);<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>  // locateToPrevious is true means we will use the start key of a region to locate the region<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  // placed before it. Used for reverse scan. See the comment of<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  // AsyncRegionLocator.getPreviousRegionLocation.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  private CompletableFuture&lt;HRegionLocation&gt; getRegionLocationInternal(TableName tableName,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      byte[] row, RegionLocateType locateType, boolean reload) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    // AFTER should be convert to CURRENT before calling this method<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    assert !locateType.equals(RegionLocateType.AFTER);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    TableCache tableCache = getTableCache(tableName);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    if (!reload) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      if (loc != null) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>        return CompletableFuture.completedFuture(loc);<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>    CompletableFuture&lt;HRegionLocation&gt; future;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    LocateRequest req;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    boolean sendRequest = false;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    synchronized (tableCache) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      // check again<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      if (!reload) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        if (loc != null) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>          return CompletableFuture.completedFuture(loc);<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>      req = new LocateRequest(row, locateType);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      future = tableCache.allRequests.get(req);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      if (future == null) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        future = new CompletableFuture&lt;&gt;();<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        tableCache.allRequests.put(req, future);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        if (tableCache.hasQuota(maxConcurrentLocateRequestPerTable) &amp;&amp; !tableCache.isPending(req)) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>          tableCache.send(req);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          sendRequest = true;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    if (sendRequest) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      locateInMeta(tableName, req);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    return future;<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>  CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, byte[] row,<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      RegionLocateType locateType, boolean reload) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    if (locateType.equals(RegionLocateType.BEFORE)) {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      return getRegionLocationInternal(tableName, row, locateType, reload);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    } else {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      // as we know the exact row after us, so we can just create the new row, and use the same<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      // algorithm to locate it.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      if (locateType.equals(RegionLocateType.AFTER)) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        row = createClosestRowAfter(row);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      return getRegionLocationInternal(tableName, row, RegionLocateType.CURRENT, reload);<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><a name="line.503"></a>
+<span class="sourceLineNo">504</span>  void updateCachedLocation(HRegionLocation loc, Throwable exception) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    AsyncRegionLocator.updateCachedLocation(loc, exception, l -&gt; {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      TableCache tableCache = cache.get(l.getRegion().getTable());<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      if (tableCache == null) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        return null;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      return tableCache.cache.get(l.getRegion().getStartKey());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    }, this::addToCache, this::removeFromCache);<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>  void clearCache(TableName tableName) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    TableCache tableCache = cache.remove(tableName);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    if (tableCache == null) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      return;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    synchronized (tableCache) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      if (!tableCache.allRequests.isEmpty()) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        IOException error = new IOException("Cache cleared");<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        tableCache.allRequests.values().forEach(f -&gt; f.completeExceptionally(error));<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      }<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><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  // only used for testing whether we have cached the location for a region.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  @VisibleForTesting<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  HRegionLocation getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    TableCache tableCache = cache.get(tableName);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (tableCache == null) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      return null;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return locateRowInCache(tableCache, tableName, row);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>}<a name="line.536"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html
index 2c05279..32df0cc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html
@@ -129,7 +129,7 @@
 <span class="sourceLineNo">121</span>        if (tries &gt; startLogErrorsCnt) {<a name="line.121"></a>
 <span class="sourceLineNo">122</span>          if (LOG.isInfoEnabled()) {<a name="line.122"></a>
 <span class="sourceLineNo">123</span>            StringBuilder builder = new StringBuilder("Call exception, tries=").append(tries)<a name="line.123"></a>
-<span class="sourceLineNo">124</span>              .append(", retries=").append(tries).append(", started=")<a name="line.124"></a>
+<span class="sourceLineNo">124</span>              .append(", retries=").append(maxAttempts).append(", started=")<a name="line.124"></a>
 <span class="sourceLineNo">125</span>              .append((EnvironmentEdgeManager.currentTime() - tracker.getStartTime()))<a name="line.125"></a>
 <span class="sourceLineNo">126</span>              .append(" ms ago, ").append("cancelled=").append(cancelled.get())<a name="line.126"></a>
 <span class="sourceLineNo">127</span>              .append(", msg=").append(t.getMessage())<a name="line.127"></a>


[16/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceLineNo">255

<TRUNCATED>

[02/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html b/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
index 608605b..f1091db 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
@@ -38,28 +38,34 @@
 <span class="sourceLineNo">030</span>   * A singleton used to make sure that only one thrift metrics source per server type is ever<a name="line.30"></a>
 <span class="sourceLineNo">031</span>   * created.<a name="line.31"></a>
 <span class="sourceLineNo">032</span>   */<a name="line.32"></a>
-<span class="sourceLineNo">033</span>  private static enum FactoryStorage {<a name="line.33"></a>
+<span class="sourceLineNo">033</span>  private enum FactoryStorage {<a name="line.33"></a>
 <span class="sourceLineNo">034</span>    INSTANCE;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>    MetricsThriftServerSourceImpl thriftOne = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.35"></a>
-<span class="sourceLineNo">036</span>        METRICS_DESCRIPTION,<a name="line.36"></a>
-<span class="sourceLineNo">037</span>        THRIFT_ONE_METRICS_CONTEXT,<a name="line.37"></a>
-<span class="sourceLineNo">038</span>        THRIFT_ONE_JMX_CONTEXT);<a name="line.38"></a>
-<span class="sourceLineNo">039</span>    MetricsThriftServerSourceImpl thriftTwo = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.39"></a>
-<span class="sourceLineNo">040</span>        METRICS_DESCRIPTION,<a name="line.40"></a>
-<span class="sourceLineNo">041</span>        THRIFT_TWO_METRICS_CONTEXT,<a name="line.41"></a>
-<span class="sourceLineNo">042</span>        THRIFT_TWO_JMX_CONTEXT);<a name="line.42"></a>
-<span class="sourceLineNo">043</span>  }<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>  @Override<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  public MetricsThriftServerSource createThriftOneSource() {<a name="line.46"></a>
+<span class="sourceLineNo">035</span>    MetricsThriftServerSourceImpl thriftOne;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>    MetricsThriftServerSourceImpl thriftTwo;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  }<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  @Override<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public MetricsThriftServerSource createThriftOneSource() {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>    if (FactoryStorage.INSTANCE.thriftOne == null) {<a name="line.41"></a>
+<span class="sourceLineNo">042</span>      FactoryStorage.INSTANCE.thriftOne = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.42"></a>
+<span class="sourceLineNo">043</span>          METRICS_DESCRIPTION,<a name="line.43"></a>
+<span class="sourceLineNo">044</span>          THRIFT_ONE_METRICS_CONTEXT,<a name="line.44"></a>
+<span class="sourceLineNo">045</span>          THRIFT_ONE_JMX_CONTEXT);<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    }<a name="line.46"></a>
 <span class="sourceLineNo">047</span>    return FactoryStorage.INSTANCE.thriftOne;<a name="line.47"></a>
 <span class="sourceLineNo">048</span>  }<a name="line.48"></a>
 <span class="sourceLineNo">049</span><a name="line.49"></a>
 <span class="sourceLineNo">050</span>  @Override<a name="line.50"></a>
 <span class="sourceLineNo">051</span>  public MetricsThriftServerSource createThriftTwoSource() {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    return FactoryStorage.INSTANCE.thriftTwo;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
-<span class="sourceLineNo">054</span>}<a name="line.54"></a>
+<span class="sourceLineNo">052</span>    if (FactoryStorage.INSTANCE.thriftTwo == null) {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>      FactoryStorage.INSTANCE.thriftTwo = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.53"></a>
+<span class="sourceLineNo">054</span>          METRICS_DESCRIPTION,<a name="line.54"></a>
+<span class="sourceLineNo">055</span>          THRIFT_TWO_METRICS_CONTEXT,<a name="line.55"></a>
+<span class="sourceLineNo">056</span>          THRIFT_TWO_JMX_CONTEXT);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    }<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    return FactoryStorage.INSTANCE.thriftTwo;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  }<a name="line.59"></a>
+<span class="sourceLineNo">060</span>}<a name="line.60"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
index 608605b..f1091db 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
@@ -38,28 +38,34 @@
 <span class="sourceLineNo">030</span>   * A singleton used to make sure that only one thrift metrics source per server type is ever<a name="line.30"></a>
 <span class="sourceLineNo">031</span>   * created.<a name="line.31"></a>
 <span class="sourceLineNo">032</span>   */<a name="line.32"></a>
-<span class="sourceLineNo">033</span>  private static enum FactoryStorage {<a name="line.33"></a>
+<span class="sourceLineNo">033</span>  private enum FactoryStorage {<a name="line.33"></a>
 <span class="sourceLineNo">034</span>    INSTANCE;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>    MetricsThriftServerSourceImpl thriftOne = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.35"></a>
-<span class="sourceLineNo">036</span>        METRICS_DESCRIPTION,<a name="line.36"></a>
-<span class="sourceLineNo">037</span>        THRIFT_ONE_METRICS_CONTEXT,<a name="line.37"></a>
-<span class="sourceLineNo">038</span>        THRIFT_ONE_JMX_CONTEXT);<a name="line.38"></a>
-<span class="sourceLineNo">039</span>    MetricsThriftServerSourceImpl thriftTwo = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.39"></a>
-<span class="sourceLineNo">040</span>        METRICS_DESCRIPTION,<a name="line.40"></a>
-<span class="sourceLineNo">041</span>        THRIFT_TWO_METRICS_CONTEXT,<a name="line.41"></a>
-<span class="sourceLineNo">042</span>        THRIFT_TWO_JMX_CONTEXT);<a name="line.42"></a>
-<span class="sourceLineNo">043</span>  }<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>  @Override<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  public MetricsThriftServerSource createThriftOneSource() {<a name="line.46"></a>
+<span class="sourceLineNo">035</span>    MetricsThriftServerSourceImpl thriftOne;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>    MetricsThriftServerSourceImpl thriftTwo;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  }<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  @Override<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public MetricsThriftServerSource createThriftOneSource() {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>    if (FactoryStorage.INSTANCE.thriftOne == null) {<a name="line.41"></a>
+<span class="sourceLineNo">042</span>      FactoryStorage.INSTANCE.thriftOne = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.42"></a>
+<span class="sourceLineNo">043</span>          METRICS_DESCRIPTION,<a name="line.43"></a>
+<span class="sourceLineNo">044</span>          THRIFT_ONE_METRICS_CONTEXT,<a name="line.44"></a>
+<span class="sourceLineNo">045</span>          THRIFT_ONE_JMX_CONTEXT);<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    }<a name="line.46"></a>
 <span class="sourceLineNo">047</span>    return FactoryStorage.INSTANCE.thriftOne;<a name="line.47"></a>
 <span class="sourceLineNo">048</span>  }<a name="line.48"></a>
 <span class="sourceLineNo">049</span><a name="line.49"></a>
 <span class="sourceLineNo">050</span>  @Override<a name="line.50"></a>
 <span class="sourceLineNo">051</span>  public MetricsThriftServerSource createThriftTwoSource() {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    return FactoryStorage.INSTANCE.thriftTwo;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
-<span class="sourceLineNo">054</span>}<a name="line.54"></a>
+<span class="sourceLineNo">052</span>    if (FactoryStorage.INSTANCE.thriftTwo == null) {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>      FactoryStorage.INSTANCE.thriftTwo = new MetricsThriftServerSourceImpl(METRICS_NAME,<a name="line.53"></a>
+<span class="sourceLineNo">054</span>          METRICS_DESCRIPTION,<a name="line.54"></a>
+<span class="sourceLineNo">055</span>          THRIFT_TWO_METRICS_CONTEXT,<a name="line.55"></a>
+<span class="sourceLineNo">056</span>          THRIFT_TWO_JMX_CONTEXT);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    }<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    return FactoryStorage.INSTANCE.thriftTwo;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  }<a name="line.59"></a>
+<span class="sourceLineNo">060</span>}<a name="line.60"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 96ae6c2..d07fe99 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -404,7 +404,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index f5c9996..c2eb868 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 1415ad5..5e5d0d0 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 9e0d50d..3998121 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 5e4ff4a..e602866 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index d3249e5..5ef7d8a 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 7df5c8b..cd5a571 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 09491ea..f9732cb 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 5f1c1ba..e0da645 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 4efbb17..900ab4f 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 00076a6..63af7d3 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index c62a135..eda8ac8 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <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.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 647ac00..f27f36a 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 4473371..0adfc1f 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index e0383c8..df34c7c 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index b189b1e..3f4ccf6 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 8b88dff..b733df9 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 62d06a9..e812654 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <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.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index a32d17b..48ac08c 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 8f96e3d..78bdd7e 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index c15dffb..06154fa 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-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-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index a534bd5..2e37497 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -742,7 +742,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 8b0d8d4..713d55c 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -53001,6 +53001,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testLocateAfter--">testLocateAfter()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html" title="class in org.apache.hadoop.hbase.client">TestAsyncNonMetaRegionLocator</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testLocateBeforeLastRegion--">testLocateBeforeLastRegion()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html" title="class in org.apache.hadoop.hbase.client">TestAsyncNonMetaRegionLocator</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncSingleRequestRpcRetryingCaller.html#testLocateError--">testLocateError()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncSingleRequestRpcRetryingCaller.html" title="class in org.apache.hadoop.hbase.client">TestAsyncSingleRequestRpcRetryingCaller</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestConnectionImplementation.html#testLocateRegionsWithRegionReplicas--">testLocateRegionsWithRegionReplicas()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">TestConnectionImplementation</a></dt>
@@ -61702,6 +61704,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/http/lib/TestStaticUserWebFilter.html#TestStaticUserWebFilter--">TestStaticUserWebFilter()</a></span> - Constructor for class org.apache.hadoop.hbase.http.lib.<a href="org/apache/hadoop/hbase/http/lib/TestStaticUserWebFilter.html" title="class in org.apache.hadoop.hbase.http.lib">TestStaticUserWebFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testStatusJournal--">testStatusJournal()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html" title="class in org.apache.hadoop.hbase.monitoring">TestTaskMonitor</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/rest/TestStatusResource.html" title="class in org.apache.hadoop.hbase.rest"><span class="typeNameLink">TestStatusResource</span></a> - Class in <a href="org/apache/hadoop/hbase/rest/package-summary.html">org.apache.hadoop.hbase.rest</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestStatusResource.html#TestStatusResource--">TestStatusResource()</a></span> - Constructor for class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestStatusResource.html" title="class in org.apache.hadoop.hbase.rest">TestStatusResource</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
index fca9b71..beb6ae6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":9,"i6":9,"i7":9,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":9,"i6":9,"i7":9,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":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/client/TestAsyncNonMetaRegionLocator.html#line.58">TestAsyncNonMetaRegionLocator</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.57">TestAsyncNonMetaRegionLocator</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>
@@ -242,22 +242,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </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/client/TestAsyncNonMetaRegionLocator.html#testMultiRegionTable--">testMultiRegionTable</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testLocateBeforeLastRegion--">testLocateBeforeLastRegion</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/client/TestAsyncNonMetaRegionLocator.html#testNoTable--">testNoTable</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testMultiRegionTable--">testMultiRegionTable</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/client/TestAsyncNonMetaRegionLocator.html#testRegionMove--">testRegionMove</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testNoTable--">testNoTable</a></span>()</code>&nbsp;</td>
 </tr>
 <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/client/TestAsyncNonMetaRegionLocator.html#testReload--">testReload</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testRegionMove--">testRegionMove</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testReload--">testReload</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i17" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#testSingleRegionTable--">testSingleRegionTable</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -288,7 +292,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/TestAsyncNonMetaRegionLocator.html#line.61">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/TestAsyncNonMetaRegionLocator.html#line.60">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -297,7 +301,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/TestAsyncNonMetaRegionLocator.html#line.64">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/TestAsyncNonMetaRegionLocator.html#line.63">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="TABLE_NAME">
@@ -306,7 +310,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_NAME</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.66">TABLE_NAME</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.65">TABLE_NAME</a></pre>
 </li>
 </ul>
 <a name="FAMILY">
@@ -315,7 +319,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/TestAsyncNonMetaRegionLocator.html#line.68">FAMILY</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.67">FAMILY</a></pre>
 </li>
 </ul>
 <a name="CONN">
@@ -324,7 +328,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.AsyncConnectionImpl <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.70">CONN</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncConnectionImpl <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.69">CONN</a></pre>
 </li>
 </ul>
 <a name="LOCATOR">
@@ -333,7 +337,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>LOCATOR</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.72">LOCATOR</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.71">LOCATOR</a></pre>
 </li>
 </ul>
 <a name="SPLIT_KEYS">
@@ -342,7 +346,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/TestAsyncNonMetaRegionLocator.html#line.74">SPLIT_KEYS</a></pre>
+<pre>private static&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.73">SPLIT_KEYS</a></pre>
 </li>
 </ul>
 </li>
@@ -359,7 +363,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestAsyncNonMetaRegionLocator</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.58">TestAsyncNonMetaRegionLocator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.57">TestAsyncNonMetaRegionLocator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -376,7 +380,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/TestAsyncNonMetaRegionLocator.html#line.77">setUp</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.76">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>
@@ -390,7 +394,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/TestAsyncNonMetaRegionLocator.html#line.91">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.90">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>
@@ -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>tearDownAfterTest</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.97">tearDownAfterTest</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.96">tearDownAfterTest</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>
@@ -418,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>createSingleRegionTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.108">createSingleRegionTable</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.107">createSingleRegionTable</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>
@@ -434,7 +438,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.114">testNoTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.113">testNoTable</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>
@@ -448,7 +452,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDisableTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.125">testDisableTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.124">testDisableTable</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>
@@ -464,7 +468,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertLocEquals</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.137">assertLocEquals</a>(byte[]&nbsp;startKey,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.136">assertLocEquals</a>(byte[]&nbsp;startKey,
                              byte[]&nbsp;endKey,
                              org.apache.hadoop.hbase.ServerName&nbsp;serverName,
                              org.apache.hadoop.hbase.HRegionLocation&nbsp;loc)</pre>
@@ -476,7 +480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSingleRegionTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.147">testSingleRegionTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.146">testSingleRegionTable</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>
@@ -494,7 +498,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createMultiRegionTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.162">createMultiRegionTable</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.161">createMultiRegionTable</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>
@@ -510,7 +514,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartKeys</h4>
-<pre>private static&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.167">getStartKeys</a>()</pre>
+<pre>private static&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.166">getStartKeys</a>()</pre>
 </li>
 </ul>
 <a name="getEndKeys--">
@@ -519,7 +523,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getEndKeys</h4>
-<pre>private static&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.174">getEndKeys</a>()</pre>
+<pre>private static&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.173">getEndKeys</a>()</pre>
 </li>
 </ul>
 <a name="getLocations-byte:A:A-">
@@ -528,7 +532,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLocations</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.ServerName[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.180">getLocations</a>(byte[][]&nbsp;startKeys)</pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.ServerName[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.179">getLocations</a>(byte[][]&nbsp;startKeys)</pre>
 </li>
 </ul>
 <a name="testMultiRegionTable--">
@@ -537,7 +541,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMultiRegionTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.193">testMultiRegionTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.192">testMultiRegionTable</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>
@@ -553,7 +557,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionMove</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.233">testRegionMove</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.232">testRegionMove</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>
@@ -571,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>testLocateAfter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.264">testLocateAfter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.263">testLocateAfter</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>
@@ -589,7 +593,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testConcurrentLocate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.289">testConcurrentLocate</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.288">testConcurrentLocate</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>
@@ -604,10 +608,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testReload--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testReload</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.308">testReload</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.307">testReload</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>
@@ -615,6 +619,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testLocateBeforeLastRegion--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testLocateBeforeLastRegion</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.html#line.351">testLocateBeforeLastRegion</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>
+<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>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index ec56445..4837d80 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,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.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/testdevapidocs/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html b/testdevapidocs/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
index ea687d0..65eee47 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -175,18 +175,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i2" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testTaskLimit--">testTaskLimit</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testStatusJournal--">testStatusJournal</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testTaskMonitorBasics--">testTaskMonitorBasics</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testTaskLimit--">testTaskLimit</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testTasksGetAbortedOnLeak--">testTasksGetAbortedOnLeak</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testTaskMonitorBasics--">testTaskMonitorBasics</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testTasksGetAbortedOnLeak--">testTasksGetAbortedOnLeak</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#testWarnStuckTasks--">testWarnStuckTasks</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -313,7 +317,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testGetTasksWithFilter--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testGetTasksWithFilter</h4>
 <pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#line.157">testGetTasksWithFilter</a>()
@@ -324,6 +328,15 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testStatusJournal--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testStatusJournal</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.html#line.200">testStatusJournal</a>()</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 969b287..1239aec 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -576,15 +576,15 @@
 <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/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/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</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/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/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/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</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/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/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/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/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.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 b5bacb6..b72e392 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -205,9 +205,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.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>
 <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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 47fb93c..4c5bced 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -663,10 +663,10 @@
 <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/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/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/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/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/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/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 3c4b4a9..29ba8c2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -255,8 +255,8 @@
 <ul>
 <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/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/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/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/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 68397c8..5282059 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -141,8 +141,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/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/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>
 </ul>
 </li>


[28/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index a452596..1cfe353 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3690,
-             Errors: 15789,
+             Errors: 15788,
              Warnings: 0,
              Infos: 0
       </title>
@@ -48761,7 +48761,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  214
+                  213
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 9017978..a7f5b17 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -375,7 +375,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 8e567cf..dc3aff0 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 0763a0f..e8f63a6 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -905,7 +905,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 8b458ae..e3baf72 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -313,7 +313,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index e3832fe..18c5c8a 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1011,7 +1011,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/devapidocs/allclasses-frame.html b/devapidocs/allclasses-frame.html
index f1cf659..29c4f44 100644
--- a/devapidocs/allclasses-frame.html
+++ b/devapidocs/allclasses-frame.html
@@ -1643,7 +1643,9 @@
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">MonitoredRPCHandlerImpl</a></li>
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring" target="classFrame"><span class="interfaceName">MonitoredTask</span></a></li>
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring" target="classFrame">MonitoredTask.State</a></li>
+<li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring" target="classFrame"><span class="interfaceName">MonitoredTask.StatusJournalEntry</span></a></li>
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">MonitoredTaskImpl</a></li>
+<li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">MonitoredTaskImpl.StatusJournalEntryImpl</a></li>
 <li><a href="org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment" target="classFrame">MoveRegionProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/client/MultiAction.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">MultiAction</a></li>
 <li><a href="org/apache/hadoop/hbase/MultiActionResultTooLarge.html" title="class in org.apache.hadoop.hbase" target="classFrame">MultiActionResultTooLarge</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/devapidocs/allclasses-noframe.html b/devapidocs/allclasses-noframe.html
index 71ea0c1..24b638c 100644
--- a/devapidocs/allclasses-noframe.html
+++ b/devapidocs/allclasses-noframe.html
@@ -1643,7 +1643,9 @@
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandlerImpl</a></li>
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="interfaceName">MonitoredTask</span></a></li>
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a></li>
+<li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="interfaceName">MonitoredTask.StatusJournalEntry</span></a></li>
 <li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></li>
+<li><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></li>
 <li><a href="org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MoveRegionProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/client/MultiAction.html" title="class in org.apache.hadoop.hbase.client">MultiAction</a></li>
 <li><a href="org/apache/hadoop/hbase/MultiActionResultTooLarge.html" title="class in org.apache.hadoop.hbase">MultiActionResultTooLarge</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 56b0fb6..653075c 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3789,21 +3789,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Sat Jul  7 14:40:00 UTC 2018"</code></td>
+<td class="colLast"><code>"Mon Jul  9 14:39:06 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>"361be533445e06ce477db9ac07a809e11f813ed4"</code></td>
+<td class="colLast"><code>"59867eeeebd28fcc49f338ef36769fb6a9bff4dc"</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>"98ef0582528be50e91286419c53c8e29"</code></td>
+<td class="colLast"><code>"0c4202f0f4e6233beea2dec060218d34"</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/67e3bccd/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index d21c306..0771a77 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -25722,6 +25722,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/HBaseAdmin.html#disableReplicationPeerAsync-java.lang.String-">disableReplicationPeerAsync(String)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/HBaseAdmin.html" title="class in org.apache.hadoop.hbase.client">HBaseAdmin</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html#disableStatusJournal--">disableStatusJournal()</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#disableStatusJournal--">disableStatusJournal()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Admin.html#disableTable-org.apache.hadoop.hbase.TableName-">disableTable(TableName)</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a></dt>
 <dd>
 <div class="block">Disable table and wait on completion.</div>
@@ -27192,6 +27196,16 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/HBaseAdmin.html#enableReplicationPeerAsync-java.lang.String-">enableReplicationPeerAsync(String)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/HBaseAdmin.html" title="class in org.apache.hadoop.hbase.client">HBaseAdmin</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html#enableStatusJournal-boolean-">enableStatusJournal(boolean)</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></dt>
+<dd>
+<div class="block">Enable journal that will store all statuses that have been set along with the time stamps when
+ they were set.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#enableStatusJournal-boolean-">enableStatusJournal(boolean)</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
+<dd>
+<div class="block">Enables journaling of this monitored task, the first invocation will lazily initialize the
+ journal.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Admin.html#enableTable-org.apache.hadoop.hbase.TableName-">enableTable(TableName)</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a></dt>
 <dd>
 <div class="block">Enable a table.</div>
@@ -50482,12 +50496,22 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatus--">getStatus()</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html#getStatus--">getStatus()</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatus--">getStatus()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#getStatus--">getStatus()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure/Procedure.html#getStatus--">getStatus()</a></span> - Method in class org.apache.hadoop.hbase.procedure.<a href="org/apache/hadoop/hbase/procedure/Procedure.html" title="class in org.apache.hadoop.hbase.procedure">Procedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/BackupInfo.html#getStatusAndProgressAsString--">getStatusAndProgressAsString()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusJournal--">getStatusJournal()</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatusJournal--">getStatusJournal()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
+<dd>
+<div class="block">Returns the status journal.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusTime--">getStatusTime()</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatusTime--">getStatusTime()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
@@ -52433,6 +52457,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html#getTimestamp--">getTimestamp()</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager.RegionInTransitionStat</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html#getTimeStamp--">getTimeStamp()</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#getTimeStamp--">getTimeStamp()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PrivateCellUtil.FirstOnRowByteBufferExtendedCell.html#getTimestamp--">getTimestamp()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PrivateCellUtil.FirstOnRowByteBufferExtendedCell.html" title="class in org.apache.hadoop.hbase">PrivateCellUtil.FirstOnRowByteBufferExtendedCell</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PrivateCellUtil.FirstOnRowCell.html#getTimestamp--">getTimestamp()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PrivateCellUtil.FirstOnRowCell.html" title="class in org.apache.hadoop.hbase">PrivateCellUtil.FirstOnRowCell</a></dt>
@@ -65165,6 +65193,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/RegexStringComparator.JoniRegexEngine.html#joniToPatternFlags-int-">joniToPatternFlags(int)</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/RegexStringComparator.JoniRegexEngine.html" title="class in org.apache.hadoop.hbase.filter">RegexStringComparator.JoniRegexEngine</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#journal">journal</a></span> - Variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#journalEnabled">journalEnabled</a></span> - Variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/util/JRubyFormat.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">JRubyFormat</span></a> - Class in <a href="org/apache/hadoop/hbase/util/package-summary.html">org.apache.hadoop.hbase.util</a></dt>
 <dd>
 <div class="block">Utility class for converting objects to JRuby.</div>
@@ -75278,10 +75310,14 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a> - Enum in <a href="org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.StatusJournalEntry</span></a> - Interface in <a href="org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTaskImpl</span></a> - Class in <a href="org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#MonitoredTaskImpl--">MonitoredTaskImpl()</a></span> - Constructor for class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTaskImpl.StatusJournalEntryImpl</span></a> - Class in <a href="org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/TaskMonitor.html#monitorInterval">monitorInterval</a></span> - Variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/TaskMonitor.html" title="class in org.apache.hadoop.hbase.monitoring">TaskMonitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#monitorRegionServers-java.util.Map-org.apache.hadoop.hbase.tool.Canary.RegionServerStdOutSink-">monitorRegionServers(Map&lt;String, List&lt;RegionInfo&gt;&gt;, Canary.RegionServerStdOutSink)</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></dt>
@@ -84778,6 +84814,10 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><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> - Enum in <a href="org/apache/hadoop/hbase/util/package-summary.html">org.apache.hadoop.hbase.util</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html#prettyPrintJournal--">prettyPrintJournal()</a></span> - Method in interface org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#prettyPrintJournal--">prettyPrintJournal()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html#preUnassign-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-boolean-">preUnassign(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, RegionInfo, boolean)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterObserver</a></dt>
 <dd>
 <div class="block">Called prior to unassigning a given region.</div>
@@ -109111,6 +109151,8 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#status">status</a></span> - Variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#status">status</a></span> - Variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html#Status--">Status()</a></span> - Constructor for enum org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver">SplitLogWorker.TaskExecutor.Status</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#status">status</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html" title="class in org.apache.hadoop.hbase.snapshot">RestoreSnapshotHelper</a></dt>
@@ -109157,8 +109199,12 @@ service.</div>
 <dd>
 <div class="block">The implementation class used to publish the status.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#StatusJournalEntryImpl-java.lang.String-long-">StatusJournalEntryImpl(String, long)</a></span> - Constructor for class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html#statusMsg">statusMsg</a></span> - Variable in enum org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master">SplitLogManager.TerminationStatus</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#statusTime">statusTime</a></span> - Variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#statusTime">statusTime</a></span> - Variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#std-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.coprocessor.ColumnInterpreter-org.apache.hadoop.hbase.client.Scan-">std(TableName, ColumnInterpreter&lt;R, S, P, Q, T&gt;, Scan)</a></span> - Method in class org.apache.hadoop.hbase.client.coprocessor.<a href="org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html" title="class in org.apache.hadoop.hbase.client.coprocessor">AggregationClient</a></dt>
@@ -114820,6 +114866,8 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandlerImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html#toString--">toString()</a></span> - Method in enum org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring">TaskMonitor.TaskFilter.TaskType</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 155a44c..a6b88dd 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/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>
-<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
index 1050909..6dd8638 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html
@@ -532,7 +532,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>locateInMeta</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.355">locateInMeta</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.356">locateInMeta</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                           <a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.LocateRequest</a>&nbsp;req)</pre>
 </li>
 </ul>
@@ -542,7 +542,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>locateInCache</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.440">locateInCache</a>(<a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.TableCache</a>&nbsp;tableCache,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.441">locateInCache</a>(<a href="../../../../../org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.TableCache.html" title="class in org.apache.hadoop.hbase.client">AsyncNonMetaRegionLocator.TableCache</a>&nbsp;tableCache,
                                       <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                       byte[]&nbsp;row,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;locateType)</pre>
@@ -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>getRegionLocationInternal</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.450">getRegionLocationInternal</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.451">getRegionLocationInternal</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                                      byte[]&nbsp;row,
                                                                      <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;locateType,
                                                                      boolean&nbsp;reload)</pre>
@@ -566,7 +566,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionLocation</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.489">getRegionLocation</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html?is-external=true" title="class or interface in java.util.concurrent">CompletableFuture</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.490">getRegionLocation</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                      byte[]&nbsp;row,
                                                      <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client">RegionLocateType</a>&nbsp;locateType,
                                                      boolean&nbsp;reload)</pre>
@@ -578,7 +578,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCachedLocation</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.503">updateCachedLocation</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.504">updateCachedLocation</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc,
                           <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>&nbsp;exception)</pre>
 </li>
 </ul>
@@ -588,7 +588,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>clearCache</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.513">clearCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.514">clearCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getRegionLocationInCache-org.apache.hadoop.hbase.TableName-byte:A-">
@@ -597,7 +597,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionLocationInCache</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.528">getRegionLocationInCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.html#line.529">getRegionLocationInCache</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                          byte[]&nbsp;row)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 d0f5d3d..2ca230f 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -552,24 +552,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 8168c8d..b304b1f 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/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.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/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/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/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/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/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.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/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/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/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/67e3bccd/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 323b37f..00d865f 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/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/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/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/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 6a2998c..a6039ad 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -349,9 +349,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/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/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>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 f930505..bc33c0a 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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 1799704..abd92a9 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.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>
+<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>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
index 3afcaf1..3e07d08 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
@@ -567,7 +567,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteP
 <ul class="blockList">
 <li class="blockList">
 <h4>rollback</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.175">rollback</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.176">rollback</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#rollback-TEnvironment-">Procedure</a></code></span></div>
@@ -594,7 +594,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteP
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.180">abort</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.181">abort</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#abort-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The abort() call is asynchronous and each procedure must decide how to deal
  with it, if they want to be abortable. The simplest implementation
@@ -617,7 +617,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteP
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.185">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.186">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -639,7 +639,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteP
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.195">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.196">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -660,7 +660,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteP
 <ul class="blockList">
 <li class="blockList">
 <h4>getPeerId</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.205">getPeerId</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.206">getPeerId</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.html#getPeerId--">getPeerId</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface</a></code></dd>
@@ -673,7 +673,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/RemoteP
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getPeerOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface.PeerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.210">getPeerOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface.PeerOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html#line.211">getPeerOperationType</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.html#getPeerOperationType--">getPeerOperationType</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">PeerProcedureInterface</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html
index f1b3e86..7577d96 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html
@@ -132,7 +132,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></code></li>
 </ul>
 </li>
 </ul>
@@ -201,7 +201,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#abort-java.lang.String-">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#cleanup--">cleanup</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#clone--">clone</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#expireNow--">expireNow</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getDescription--">getDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStartTime--">getStartTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getState--">getState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStateTime--">getStateTime<
 /a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatus--">getStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusTime--">getStatusTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getWarnTime--">getWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#markComplete-java.lang.String-">markComplete</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#pause-java.lang.String-">pause</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#resume-java.lang.String-">resume</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setDescription-java.lang.String-">setDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setStatus-java.lang.String-">setStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/mo
 nitoring/MonitoredTask.html#setWarnTime-long-">setWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toJSON--">toJSON</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toMap--">toMap</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#abort-java.lang.String-">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#cleanup--">cleanup</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#clone--">clone</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#disableStatusJournal--">disableStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#enableStatusJournal-boolean-">enableStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#expireNow--">expireNow</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getDescription--">getDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/Mon
 itoredTask.html#getStartTime--">getStartTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getState--">getState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStateTime--">getStateTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatus--">getStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusJournal--">getStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusTime--">getStatusTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getWarnTime--">getWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#markComplete-java.lang.String-">markComplete</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#pause-java.lang.String-">pause</a>, <a href="../../../../../org/apache/hado
 op/hbase/monitoring/MonitoredTask.html#prettyPrintJournal--">prettyPrintJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#resume-java.lang.String-">resume</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setDescription-java.lang.String-">setDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setStatus-java.lang.String-">setStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setWarnTime-long-">setWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toJSON--">toJSON</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toMap--">toMap</a></code></li>
 </ul>
 </li>
 </ul>


[30/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.


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

Branch: refs/heads/asf-site
Commit: 67e3bccdd80ed7b27f694806555d32a755c7866f
Parents: ed4b072
Author: jenkins <bu...@apache.org>
Authored: Mon Jul 9 14:47:59 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Mon Jul 9 14:47:59 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 13774 ++++++++---------
 checkstyle.rss                                  |     4 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/allclasses-frame.html                |     2 +
 devapidocs/allclasses-noframe.html              |     2 +
 devapidocs/constant-values.html                 |     6 +-
 devapidocs/index-all.html                       |    48 +
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hbase/client/AsyncNonMetaRegionLocator.html |    14 +-
 .../hadoop/hbase/client/package-tree.html       |    22 +-
 .../hadoop/hbase/filter/package-tree.html       |     8 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     4 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 ...SyncReplicationReplayWALRemoteProcedure.html |    12 +-
 .../hbase/monitoring/MonitoredRPCHandler.html   |     4 +-
 .../monitoring/MonitoredRPCHandlerImpl.html     |     6 +-
 .../hbase/monitoring/MonitoredTask.State.html   |    18 +-
 .../MonitoredTask.StatusJournalEntry.html       |   243 +
 .../hadoop/hbase/monitoring/MonitoredTask.html  |   141 +-
 ...onitoredTaskImpl.StatusJournalEntryImpl.html |   370 +
 .../hbase/monitoring/MonitoredTaskImpl.html     |   236 +-
 .../hbase/monitoring/StateDumpServlet.html      |     4 +-
 .../MonitoredTask.StatusJournalEntry.html       |   197 +
 ...onitoredTaskImpl.StatusJournalEntryImpl.html |   125 +
 .../hadoop/hbase/monitoring/package-frame.html  |     2 +
 .../hbase/monitoring/package-summary.html       |    16 +-
 .../hadoop/hbase/monitoring/package-tree.html   |     4 +-
 .../hadoop/hbase/monitoring/package-use.html    |    11 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    18 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../HRegion.BatchOperation.Visitor.html         |     4 +-
 .../regionserver/HRegion.BatchOperation.html    |    78 +-
 .../regionserver/HRegion.BulkLoadListener.html  |     8 +-
 .../HRegion.FlushResult.Result.html             |    10 +-
 .../hbase/regionserver/HRegion.FlushResult.html |     8 +-
 .../HRegion.MutationBatchOperation.html         |    44 +-
 .../regionserver/HRegion.RegionScannerImpl.html |    90 +-
 .../HRegion.ReplayBatchOperation.html           |    32 +-
 .../regionserver/HRegion.RowLockContext.html    |    28 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html |    16 +-
 .../hadoop/hbase/regionserver/HRegion.html      |   386 +-
 .../hadoop/hbase/regionserver/package-tree.html |    20 +-
 .../regionserver/querymatcher/package-tree.html |     4 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hbase/security/access/package-tree.html     |     4 +-
 .../hadoop/hbase/security/package-tree.html     |     4 +-
 ...tServerSourceFactoryImpl.FactoryStorage.html |     2 +-
 .../MetricsThriftServerSourceFactoryImpl.html   |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     8 +-
 devapidocs/overview-tree.html                   |     2 +
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 ...AsyncNonMetaRegionLocator.LocateRequest.html |   399 +-
 .../AsyncNonMetaRegionLocator.TableCache.html   |   399 +-
 .../hbase/client/AsyncNonMetaRegionLocator.html |   399 +-
 .../hbase/client/RpcRetryingCallerImpl.html     |     2 +-
 ...SyncReplicationReplayWALRemoteProcedure.html |    99 +-
 .../hbase/monitoring/MonitoredTask.State.html   |   130 +-
 .../MonitoredTask.StatusJournalEntry.html       |   172 +
 .../hadoop/hbase/monitoring/MonitoredTask.html  |   130 +-
 ...onitoredTaskImpl.StatusJournalEntryImpl.html |   349 +
 .../hbase/monitoring/MonitoredTaskImpl.html     |   419 +-
 .../HRegion.BatchOperation.Visitor.html         | 12802 +++++++--------
 .../regionserver/HRegion.BatchOperation.html    | 12802 +++++++--------
 .../regionserver/HRegion.BulkLoadListener.html  | 12802 +++++++--------
 .../HRegion.FlushResult.Result.html             | 12802 +++++++--------
 .../hbase/regionserver/HRegion.FlushResult.html | 12802 +++++++--------
 .../regionserver/HRegion.FlushResultImpl.html   | 12802 +++++++--------
 .../HRegion.MutationBatchOperation.html         | 12802 +++++++--------
 .../HRegion.ObservedExceptionsInBatch.html      | 12802 +++++++--------
 .../HRegion.PrepareFlushResult.html             | 12802 +++++++--------
 .../regionserver/HRegion.RegionScannerImpl.html | 12802 +++++++--------
 .../HRegion.ReplayBatchOperation.html           | 12802 +++++++--------
 .../regionserver/HRegion.RowLockContext.html    | 12802 +++++++--------
 .../hbase/regionserver/HRegion.RowLockImpl.html | 12802 +++++++--------
 .../hbase/regionserver/HRegion.WriteState.html  | 12802 +++++++--------
 .../hadoop/hbase/regionserver/HRegion.html      | 12802 +++++++--------
 ...tServerSourceFactoryImpl.FactoryStorage.html |    38 +-
 .../MetricsThriftServerSourceFactoryImpl.html   |    38 +-
 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                   |     4 +
 .../client/TestAsyncNonMetaRegionLocator.html   |    86 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 .../hbase/monitoring/TestTaskMonitor.html       |    23 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hadoop/hbase/regionserver/package-tree.html |     2 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../client/TestAsyncNonMetaRegionLocator.html   |   633 +-
 .../hbase/monitoring/TestTaskMonitor.html       |    29 +-
 124 files changed, 106802 insertions(+), 104796 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 0b002e3..40583b9 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index adc0622..50855bd 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:20180707143001+00'00')
-/CreationDate (D:20180707144559+00'00')
+/ModDate (D:20180709142918+00'00')
+/CreationDate (D:20180709144505+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 369d5ae..37552bd 100644
--- a/book.html
+++ b/book.html
@@ -40768,7 +40768,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-07-07 14:30:01 UTC
+Last updated 2018-07-09 14:29:18 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 27ae888..5b46f60 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="20180707" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -306,7 +306,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-09</li>
             </p>
                 </div>
 


[19/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
index ee13db4..e0343ff 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALRemoteProcedure.html
@@ -169,56 +169,57 @@
 <span class="sourceLineNo">161</span>    } catch (FailedRemoteDispatchException e) {<a name="line.161"></a>
 <span class="sourceLineNo">162</span>      LOG.warn(<a name="line.162"></a>
 <span class="sourceLineNo">163</span>          "Can not add remote operation for replay wals {} on {} for peer id={}, "<a name="line.163"></a>
-<span class="sourceLineNo">164</span>              + "this usually because the server is already dead, retry",<a name="line.164"></a>
+<span class="sourceLineNo">164</span>              + "this usually because the server is already dead",<a name="line.164"></a>
 <span class="sourceLineNo">165</span>          wals, targetServer, peerId);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      throw new ProcedureYieldException();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    dispatched = true;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    event = new ProcedureEvent&lt;&gt;(this);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    event.suspendIfNotReady(this);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    throw new ProcedureSuspendedException();<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>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  protected void rollback(MasterProcedureEnv env) throws IOException, InterruptedException {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    throw new UnsupportedOperationException();<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>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  protected boolean abort(MasterProcedureEnv env) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    return false;<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>  @Override<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      throws IOException {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    SyncReplicationReplayWALRemoteStateData.Builder builder =<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        SyncReplicationReplayWALRemoteStateData.newBuilder().setPeerId(peerId)<a name="line.188"></a>
-<span class="sourceLineNo">189</span>            .setTargetServer(ProtobufUtil.toServerName(targetServer));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    wals.stream().forEach(builder::addWal);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    serializer.serialize(builder.build());<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>  @Override<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    SyncReplicationReplayWALRemoteStateData data =<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        serializer.deserialize(SyncReplicationReplayWALRemoteStateData.class);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    peerId = data.getPeerId();<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    wals = new ArrayList&lt;&gt;();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    data.getWalList().forEach(wals::add);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    targetServer = ProtobufUtil.toServerName(data.getTargetServer());<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>  @Override<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public String getPeerId() {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    return peerId;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public PeerOperationType getPeerOperationType() {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    return PeerOperationType.SYNC_REPLICATION_REPLAY_WAL_REMOTE;<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">166</span>      // Return directly and the parent procedure will assign a new worker to replay wals<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      return null;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    dispatched = true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    event = new ProcedureEvent&lt;&gt;(this);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    event.suspendIfNotReady(this);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    throw new ProcedureSuspendedException();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  @Override<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  protected void rollback(MasterProcedureEnv env) throws IOException, InterruptedException {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    throw new UnsupportedOperationException();<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>  @Override<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  protected boolean abort(MasterProcedureEnv env) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    return false;<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>  @Override<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      throws IOException {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    SyncReplicationReplayWALRemoteStateData.Builder builder =<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        SyncReplicationReplayWALRemoteStateData.newBuilder().setPeerId(peerId)<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            .setTargetServer(ProtobufUtil.toServerName(targetServer));<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    wals.stream().forEach(builder::addWal);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    serializer.serialize(builder.build());<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>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    SyncReplicationReplayWALRemoteStateData data =<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        serializer.deserialize(SyncReplicationReplayWALRemoteStateData.class);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    peerId = data.getPeerId();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    wals = new ArrayList&lt;&gt;();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    data.getWalList().forEach(wals::add);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    targetServer = ProtobufUtil.toServerName(data.getTargetServer());<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>  @Override<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  public String getPeerId() {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    return peerId;<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>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public PeerOperationType getPeerOperationType() {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    return PeerOperationType.SYNC_REPLICATION_REPLAY_WAL_REMOTE;<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
index 267118b..2193208 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
@@ -27,65 +27,85 @@
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.monitoring;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
 <span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.util.Map;<a name="line.22"></a>
-<span class="sourceLineNo">023</span><a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>@InterfaceAudience.Private<a name="line.26"></a>
-<span class="sourceLineNo">027</span>public interface MonitoredTask extends Cloneable {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>  enum State {<a name="line.28"></a>
-<span class="sourceLineNo">029</span>    RUNNING,<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    WAITING,<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    COMPLETE,<a name="line.31"></a>
-<span class="sourceLineNo">032</span>    ABORTED<a name="line.32"></a>
-<span class="sourceLineNo">033</span>  }<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>  long getStartTime();<a name="line.35"></a>
-<span class="sourceLineNo">036</span>  String getDescription();<a name="line.36"></a>
-<span class="sourceLineNo">037</span>  String getStatus();<a name="line.37"></a>
-<span class="sourceLineNo">038</span>  long getStatusTime();<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  State getState();<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  long getStateTime();<a name="line.40"></a>
-<span class="sourceLineNo">041</span>  long getCompletionTimestamp();<a name="line.41"></a>
-<span class="sourceLineNo">042</span>  long getWarnTime();<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  void markComplete(String msg);<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  void pause(String msg);<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  void resume(String msg);<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  void abort(String msg);<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  void expireNow();<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  void setStatus(String status);<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  void setDescription(String description);<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  void setWarnTime(final long t);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  /**<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   * Explicitly mark this status as able to be cleaned up,<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   * even though it might not be complete.<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   */<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  void cleanup();<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  /**<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * Public exposure of Object.clone() in order to allow clients to easily <a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * capture current state.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * @return a copy of the object whose references will not change<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   */<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  MonitoredTask clone();<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  /**<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   * Creates a string map of internal details for extensible exposure of <a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * monitored tasks.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @return A Map containing information for this task.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  Map&lt;String, Object&gt; toMap() throws IOException;<a name="line.72"></a>
+<span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.Map;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>@InterfaceAudience.Private<a name="line.27"></a>
+<span class="sourceLineNo">028</span>public interface MonitoredTask extends Cloneable {<a name="line.28"></a>
+<span class="sourceLineNo">029</span>  enum State {<a name="line.29"></a>
+<span class="sourceLineNo">030</span>    RUNNING,<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    WAITING,<a name="line.31"></a>
+<span class="sourceLineNo">032</span>    COMPLETE,<a name="line.32"></a>
+<span class="sourceLineNo">033</span>    ABORTED<a name="line.33"></a>
+<span class="sourceLineNo">034</span>  }<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>  public interface StatusJournalEntry {<a name="line.36"></a>
+<span class="sourceLineNo">037</span>    String getStatus();<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>    long getTimeStamp();<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  }<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  long getStartTime();<a name="line.42"></a>
+<span class="sourceLineNo">043</span>  String getDescription();<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  String getStatus();<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  long getStatusTime();<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  State getState();<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  long getStateTime();<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  long getCompletionTimestamp();<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  long getWarnTime();<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  void markComplete(String msg);<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  void pause(String msg);<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  void resume(String msg);<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  void abort(String msg);<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  void expireNow();<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  void setStatus(String status);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  void setDescription(String description);<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  void setWarnTime(final long t);<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  List&lt;StatusJournalEntry&gt; getStatusJournal();<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  /**<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * Enable journal that will store all statuses that have been set along with the time stamps when<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * they were set.<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param includeCurrentStatus whether to include the current set status in the journal<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  void enableStatusJournal(boolean includeCurrentStatus);<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  void disableStatusJournal();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  String prettyPrintJournal();<a name="line.72"></a>
 <span class="sourceLineNo">073</span><a name="line.73"></a>
 <span class="sourceLineNo">074</span>  /**<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * Creates a JSON object for parseable exposure of monitored tasks.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * @return An encoded JSON object containing information for this task.<a name="line.76"></a>
+<span class="sourceLineNo">075</span>   * Explicitly mark this status as able to be cleaned up,<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * even though it might not be complete.<a name="line.76"></a>
 <span class="sourceLineNo">077</span>   */<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  String toJSON() throws IOException;<a name="line.78"></a>
+<span class="sourceLineNo">078</span>  void cleanup();<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">080</span>  /**<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * Public exposure of Object.clone() in order to allow clients to easily <a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * capture current state.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * @return a copy of the object whose references will not change<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  MonitoredTask clone();<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>   * Creates a string map of internal details for extensible exposure of <a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * monitored tasks.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @return A Map containing information for this task.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  Map&lt;String, Object&gt; toMap() throws IOException;<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>   * Creates a JSON object for parseable exposure of monitored tasks.<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @return An encoded JSON object containing information for this task.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  String toJSON() throws IOException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>}<a name="line.100"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html
new file mode 100644
index 0000000..2193208
--- /dev/null
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html
@@ -0,0 +1,172 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> *<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
+<span class="sourceLineNo">012</span> *<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
+<span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
+<span class="sourceLineNo">018</span> */<a name="line.18"></a>
+<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.monitoring;<a name="line.19"></a>
+<span class="sourceLineNo">020</span><a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.Map;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>@InterfaceAudience.Private<a name="line.27"></a>
+<span class="sourceLineNo">028</span>public interface MonitoredTask extends Cloneable {<a name="line.28"></a>
+<span class="sourceLineNo">029</span>  enum State {<a name="line.29"></a>
+<span class="sourceLineNo">030</span>    RUNNING,<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    WAITING,<a name="line.31"></a>
+<span class="sourceLineNo">032</span>    COMPLETE,<a name="line.32"></a>
+<span class="sourceLineNo">033</span>    ABORTED<a name="line.33"></a>
+<span class="sourceLineNo">034</span>  }<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>  public interface StatusJournalEntry {<a name="line.36"></a>
+<span class="sourceLineNo">037</span>    String getStatus();<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>    long getTimeStamp();<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  }<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  long getStartTime();<a name="line.42"></a>
+<span class="sourceLineNo">043</span>  String getDescription();<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  String getStatus();<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  long getStatusTime();<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  State getState();<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  long getStateTime();<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  long getCompletionTimestamp();<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  long getWarnTime();<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  void markComplete(String msg);<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  void pause(String msg);<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  void resume(String msg);<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  void abort(String msg);<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  void expireNow();<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  void setStatus(String status);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  void setDescription(String description);<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  void setWarnTime(final long t);<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  List&lt;StatusJournalEntry&gt; getStatusJournal();<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  /**<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * Enable journal that will store all statuses that have been set along with the time stamps when<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * they were set.<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param includeCurrentStatus whether to include the current set status in the journal<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  void enableStatusJournal(boolean includeCurrentStatus);<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  void disableStatusJournal();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  String prettyPrintJournal();<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  /**<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * Explicitly mark this status as able to be cleaned up,<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * even though it might not be complete.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   */<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  void cleanup();<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>   * Public exposure of Object.clone() in order to allow clients to easily <a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * capture current state.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * @return a copy of the object whose references will not change<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  MonitoredTask clone();<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>   * Creates a string map of internal details for extensible exposure of <a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * monitored tasks.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @return A Map containing information for this task.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  Map&lt;String, Object&gt; toMap() throws IOException;<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>   * Creates a JSON object for parseable exposure of monitored tasks.<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @return An encoded JSON object containing information for this task.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  String toJSON() throws IOException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>}<a name="line.100"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
index 267118b..2193208 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
@@ -27,65 +27,85 @@
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.monitoring;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
 <span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.util.Map;<a name="line.22"></a>
-<span class="sourceLineNo">023</span><a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>@InterfaceAudience.Private<a name="line.26"></a>
-<span class="sourceLineNo">027</span>public interface MonitoredTask extends Cloneable {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>  enum State {<a name="line.28"></a>
-<span class="sourceLineNo">029</span>    RUNNING,<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    WAITING,<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    COMPLETE,<a name="line.31"></a>
-<span class="sourceLineNo">032</span>    ABORTED<a name="line.32"></a>
-<span class="sourceLineNo">033</span>  }<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>  long getStartTime();<a name="line.35"></a>
-<span class="sourceLineNo">036</span>  String getDescription();<a name="line.36"></a>
-<span class="sourceLineNo">037</span>  String getStatus();<a name="line.37"></a>
-<span class="sourceLineNo">038</span>  long getStatusTime();<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  State getState();<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  long getStateTime();<a name="line.40"></a>
-<span class="sourceLineNo">041</span>  long getCompletionTimestamp();<a name="line.41"></a>
-<span class="sourceLineNo">042</span>  long getWarnTime();<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  void markComplete(String msg);<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  void pause(String msg);<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  void resume(String msg);<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  void abort(String msg);<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  void expireNow();<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  void setStatus(String status);<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  void setDescription(String description);<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  void setWarnTime(final long t);<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  /**<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   * Explicitly mark this status as able to be cleaned up,<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   * even though it might not be complete.<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   */<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  void cleanup();<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  /**<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * Public exposure of Object.clone() in order to allow clients to easily <a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * capture current state.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * @return a copy of the object whose references will not change<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   */<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  MonitoredTask clone();<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  /**<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   * Creates a string map of internal details for extensible exposure of <a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * monitored tasks.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @return A Map containing information for this task.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  Map&lt;String, Object&gt; toMap() throws IOException;<a name="line.72"></a>
+<span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.Map;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>@InterfaceAudience.Private<a name="line.27"></a>
+<span class="sourceLineNo">028</span>public interface MonitoredTask extends Cloneable {<a name="line.28"></a>
+<span class="sourceLineNo">029</span>  enum State {<a name="line.29"></a>
+<span class="sourceLineNo">030</span>    RUNNING,<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    WAITING,<a name="line.31"></a>
+<span class="sourceLineNo">032</span>    COMPLETE,<a name="line.32"></a>
+<span class="sourceLineNo">033</span>    ABORTED<a name="line.33"></a>
+<span class="sourceLineNo">034</span>  }<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>  public interface StatusJournalEntry {<a name="line.36"></a>
+<span class="sourceLineNo">037</span>    String getStatus();<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>    long getTimeStamp();<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  }<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  long getStartTime();<a name="line.42"></a>
+<span class="sourceLineNo">043</span>  String getDescription();<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  String getStatus();<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  long getStatusTime();<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  State getState();<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  long getStateTime();<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  long getCompletionTimestamp();<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  long getWarnTime();<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  void markComplete(String msg);<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  void pause(String msg);<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  void resume(String msg);<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  void abort(String msg);<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  void expireNow();<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  void setStatus(String status);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  void setDescription(String description);<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  void setWarnTime(final long t);<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  List&lt;StatusJournalEntry&gt; getStatusJournal();<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  /**<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * Enable journal that will store all statuses that have been set along with the time stamps when<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * they were set.<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param includeCurrentStatus whether to include the current set status in the journal<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  void enableStatusJournal(boolean includeCurrentStatus);<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  void disableStatusJournal();<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  String prettyPrintJournal();<a name="line.72"></a>
 <span class="sourceLineNo">073</span><a name="line.73"></a>
 <span class="sourceLineNo">074</span>  /**<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * Creates a JSON object for parseable exposure of monitored tasks.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * @return An encoded JSON object containing information for this task.<a name="line.76"></a>
+<span class="sourceLineNo">075</span>   * Explicitly mark this status as able to be cleaned up,<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * even though it might not be complete.<a name="line.76"></a>
 <span class="sourceLineNo">077</span>   */<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  String toJSON() throws IOException;<a name="line.78"></a>
+<span class="sourceLineNo">078</span>  void cleanup();<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">080</span>  /**<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * Public exposure of Object.clone() in order to allow clients to easily <a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * capture current state.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * @return a copy of the object whose references will not change<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  MonitoredTask clone();<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>   * Creates a string map of internal details for extensible exposure of <a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * monitored tasks.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @return A Map containing information for this task.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  Map&lt;String, Object&gt; toMap() throws IOException;<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>   * Creates a JSON object for parseable exposure of monitored tasks.<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @return An encoded JSON object containing information for this task.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  String toJSON() throws IOException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>}<a name="line.100"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html
new file mode 100644
index 0000000..3781178
--- /dev/null
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html
@@ -0,0 +1,349 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> *<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
+<span class="sourceLineNo">012</span> *<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
+<span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
+<span class="sourceLineNo">018</span> */<a name="line.18"></a>
+<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.monitoring;<a name="line.19"></a>
+<span class="sourceLineNo">020</span><a name="line.20"></a>
+<span class="sourceLineNo">021</span>import com.fasterxml.jackson.databind.ObjectMapper;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.util.StringUtils;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.24"></a>
+<span class="sourceLineNo">025</span><a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Collections;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.HashMap;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>@InterfaceAudience.Private<a name="line.33"></a>
+<span class="sourceLineNo">034</span>class MonitoredTaskImpl implements MonitoredTask {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>  private long startTime;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>  private long statusTime;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  private long stateTime;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>  private long warnTime;<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>  private volatile String status;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private volatile String description;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>  <a name="line.42"></a>
+<span class="sourceLineNo">043</span>  protected volatile State state = State.RUNNING;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private boolean journalEnabled = false;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  private List&lt;StatusJournalEntry&gt; journal;<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  public MonitoredTaskImpl() {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    startTime = System.currentTimeMillis();<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    statusTime = startTime;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    stateTime = startTime;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    warnTime = startTime;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  }<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static class StatusJournalEntryImpl implements StatusJournalEntry {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    private long statusTime;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    private String status;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>    public StatusJournalEntryImpl(String status, long statusTime) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      this.status = status;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      this.statusTime = statusTime;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    }<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @Override<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    public String getStatus() {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      return status;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>    @Override<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    public long getTimeStamp() {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>      return statusTime;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    }<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    @Override<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    public String toString() {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      StringBuilder sb = new StringBuilder();<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      sb.append(status);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      sb.append(" at ");<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      sb.append(statusTime);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      return sb.toString();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  @Override<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public synchronized MonitoredTaskImpl clone() {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    try {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      return (MonitoredTaskImpl) super.clone();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    } catch (CloneNotSupportedException e) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      throw new AssertionError(); // Won't happen<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>  @Override<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public long getStartTime() {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    return startTime;<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>  @Override<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  public String getDescription() {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    return description;<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>  public String getStatus() {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    return status;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @Override<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public long getStatusTime() {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    return statusTime;<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>  @Override<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public State getState() {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    return state;<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>  @Override<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public long getStateTime() {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return stateTime;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public long getWarnTime() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    return warnTime;<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>  @Override<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  public long getCompletionTimestamp() {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (state == State.COMPLETE || state == State.ABORTED) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      return stateTime;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    return -1;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  @Override<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  public void markComplete(String status) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    setState(State.COMPLETE);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    setStatus(status);<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>  @Override<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public void pause(String msg) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    setState(State.WAITING);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    setStatus(msg);<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 resume(String msg) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    setState(State.RUNNING);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    setStatus(msg);<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>  @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public void abort(String msg) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    setStatus(msg);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    setState(State.ABORTED);<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>  @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  public void setStatus(String status) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    this.status = status;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    statusTime = System.currentTimeMillis();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    if (journalEnabled) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      journal.add(new StatusJournalEntryImpl(this.status, statusTime));<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>  protected void setState(State state) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    this.state = state;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    stateTime = System.currentTimeMillis();<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>  @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public void setDescription(String description) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.description = description;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  @Override<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  public void setWarnTime(long t) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    this.warnTime = t;<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>  @Override<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public void cleanup() {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (state == State.RUNNING) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      setState(State.ABORTED);<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>  /**<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * Force the completion timestamp backwards so that<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * it expires now.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   */<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  @Override<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  public void expireNow() {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    stateTime -= 180 * 1000;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  @Override<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  public Map&lt;String, Object&gt; toMap() {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    map.put("description", getDescription());<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    map.put("status", getStatus());<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    map.put("state", getState());<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    map.put("starttimems", getStartTime());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    map.put("statustimems", getCompletionTimestamp());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    map.put("statetimems", getCompletionTimestamp());<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return map;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  public String toJSON() throws IOException {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    return MAPPER.writeValueAsString(toMap());<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>  @Override<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  public String toString() {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    StringBuilder sb = new StringBuilder(512);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    sb.append(getDescription());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    sb.append(": status=");<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    sb.append(getStatus());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    sb.append(", state=");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    sb.append(getState());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    sb.append(", startTime=");<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    sb.append(getStartTime());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    sb.append(", completionTime=");<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    sb.append(getCompletionTimestamp());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    return sb.toString();<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>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * Returns the status journal. This implementation of status journal is not thread-safe. Currently<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * we use this to track various stages of flushes and compactions where we can use this/pretty<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * print for post task analysis, by which time we are already done changing states (writing to<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * journal)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public List&lt;StatusJournalEntry&gt; getStatusJournal() {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    if (journal == null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return Collections.emptyList();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } else {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      return Collections.unmodifiableList(journal);<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>  /**<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * Enables journaling of this monitored task, the first invocation will lazily initialize the<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * journal. The journal implementation itself and this method are not thread safe<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void enableStatusJournal(boolean includeCurrentStatus) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    if (journalEnabled &amp;&amp; journal != null) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      return;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    journalEnabled = true;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    if (journal == null) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      journal = new ArrayList&lt;StatusJournalEntry&gt;();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    if (includeCurrentStatus) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      journal.add(new StatusJournalEntryImpl(status, statusTime));<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>  @Override<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void disableStatusJournal() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    journalEnabled = false;<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>  @Override<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public String prettyPrintJournal() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return StringUtils.join("\n\t", getStatusJournal());<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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


[03/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        "flushsize=" + totalSizeOfFlushableStores;<a name="line.255

<TRUNCATED>

[04/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>        "flu

<TRUNCATED>

[18/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
index 64d6563..3781178 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
@@ -27,179 +27,262 @@
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.monitoring;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
 <span class="sourceLineNo">021</span>import com.fasterxml.jackson.databind.ObjectMapper;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.yetus.audience.InterfaceAudience;<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.HashMap;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.Map;<a name="line.26"></a>
-<span class="sourceLineNo">027</span><a name="line.27"></a>
-<span class="sourceLineNo">028</span>@InterfaceAudience.Private<a name="line.28"></a>
-<span class="sourceLineNo">029</span>class MonitoredTaskImpl implements MonitoredTask {<a name="line.29"></a>
-<span class="sourceLineNo">030</span>  private long startTime;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>  private long statusTime;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>  private long stateTime;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>  private long warnTime;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>  private volatile String status;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>  private volatile String description;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>  <a name="line.37"></a>
-<span class="sourceLineNo">038</span>  protected volatile State state = State.RUNNING;<a name="line.38"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.util.StringUtils;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.24"></a>
+<span class="sourceLineNo">025</span><a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Collections;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.HashMap;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Map;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>@InterfaceAudience.Private<a name="line.33"></a>
+<span class="sourceLineNo">034</span>class MonitoredTaskImpl implements MonitoredTask {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>  private long startTime;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>  private long statusTime;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  private long stateTime;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>  private long warnTime;<a name="line.38"></a>
 <span class="sourceLineNo">039</span><a name="line.39"></a>
-<span class="sourceLineNo">040</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>  public MonitoredTaskImpl() {<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    startTime = System.currentTimeMillis();<a name="line.43"></a>
-<span class="sourceLineNo">044</span>    statusTime = startTime;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>    stateTime = startTime;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    warnTime = startTime;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  }<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  @Override<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  public synchronized MonitoredTaskImpl clone() {<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    try {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>      return (MonitoredTaskImpl) super.clone();<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    } catch (CloneNotSupportedException e) {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>      throw new AssertionError(); // Won't happen<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    }<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>  @Override<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  public long getStartTime() {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    return startTime;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  }<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  <a name="line.62"></a>
-<span class="sourceLineNo">063</span>  @Override<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  public String getDescription() {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    return description;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  @Override<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public String getStatus() {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    return status;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  @Override<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public long getStatusTime() {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    return statusTime;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  }<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  <a name="line.77"></a>
-<span class="sourceLineNo">078</span>  @Override<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public State getState() {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    return state;<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>  @Override<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public long getStateTime() {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    return stateTime;<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>  @Override<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public long getWarnTime() {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    return warnTime;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  }<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Override<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  public long getCompletionTimestamp() {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    if (state == State.COMPLETE || state == State.ABORTED) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      return stateTime;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    return -1;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  @Override<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  public void markComplete(String status) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    setState(State.COMPLETE);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    setStatus(status);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public void pause(String msg) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    setState(State.WAITING);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    setStatus(msg);<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>  @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void resume(String msg) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    setState(State.RUNNING);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    setStatus(msg);<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>  @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public void abort(String msg) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    setStatus(msg);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    setState(State.ABORTED);<a name="line.122"></a>
+<span class="sourceLineNo">040</span>  private volatile String status;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private volatile String description;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>  <a name="line.42"></a>
+<span class="sourceLineNo">043</span>  protected volatile State state = State.RUNNING;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private boolean journalEnabled = false;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  private List&lt;StatusJournalEntry&gt; journal;<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  public MonitoredTaskImpl() {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    startTime = System.currentTimeMillis();<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    statusTime = startTime;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    stateTime = startTime;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    warnTime = startTime;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  }<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static class StatusJournalEntryImpl implements StatusJournalEntry {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    private long statusTime;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    private String status;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>    public StatusJournalEntryImpl(String status, long statusTime) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      this.status = status;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      this.statusTime = statusTime;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    }<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @Override<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    public String getStatus() {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      return status;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>    @Override<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    public long getTimeStamp() {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>      return statusTime;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    }<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    @Override<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    public String toString() {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      StringBuilder sb = new StringBuilder();<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      sb.append(status);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      sb.append(" at ");<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      sb.append(statusTime);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      return sb.toString();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  @Override<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public synchronized MonitoredTaskImpl clone() {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    try {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      return (MonitoredTaskImpl) super.clone();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    } catch (CloneNotSupportedException e) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      throw new AssertionError(); // Won't happen<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>  @Override<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public long getStartTime() {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    return startTime;<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>  @Override<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  public String getDescription() {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    return description;<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>  public String getStatus() {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    return status;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  @Override<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public long getStatusTime() {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    return statusTime;<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>  @Override<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public State getState() {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    return state;<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>  @Override<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public long getStateTime() {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return stateTime;<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">124</span><a name="line.124"></a>
 <span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public void setStatus(String status) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.status = status;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    statusTime = System.currentTimeMillis();<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>  protected void setState(State state) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    this.state = state;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    stateTime = System.currentTimeMillis();<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>  @Override<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public void setDescription(String description) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    this.description = description;<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>  @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public void setWarnTime(long t) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    this.warnTime = t;<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>  @Override<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  public void cleanup() {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (state == State.RUNNING) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      setState(State.ABORTED);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * Force the completion timestamp backwards so that<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * it expires now.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public void expireNow() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    stateTime -= 180 * 1000;<a name="line.159"></a>
+<span class="sourceLineNo">126</span>  public long getWarnTime() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    return warnTime;<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>  @Override<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  public long getCompletionTimestamp() {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (state == State.COMPLETE || state == State.ABORTED) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      return stateTime;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    return -1;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  @Override<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  public void markComplete(String status) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    setState(State.COMPLETE);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    setStatus(status);<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>  @Override<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public void pause(String msg) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    setState(State.WAITING);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    setStatus(msg);<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 resume(String msg) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    setState(State.RUNNING);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    setStatus(msg);<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>  @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public void abort(String msg) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    setStatus(msg);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    setState(State.ABORTED);<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">161</span>  <a name="line.161"></a>
 <span class="sourceLineNo">162</span>  @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public Map&lt;String, Object&gt; toMap() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    map.put("description", getDescription());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    map.put("status", getStatus());<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    map.put("state", getState());<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    map.put("starttimems", getStartTime());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    map.put("statustimems", getCompletionTimestamp());<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    map.put("statetimems", getCompletionTimestamp());<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    return map;<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>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public String toJSON() throws IOException {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    return MAPPER.writeValueAsString(toMap());<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>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public String toString() {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    StringBuilder sb = new StringBuilder(512);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    sb.append(getDescription());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    sb.append(": status=");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    sb.append(getStatus());<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    sb.append(", state=");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    sb.append(getState());<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    sb.append(", startTime=");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    sb.append(getStartTime());<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    sb.append(", completionTime=");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    sb.append(getCompletionTimestamp());<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    return sb.toString();<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>}<a name="line.194"></a>
+<span class="sourceLineNo">163</span>  public void setStatus(String status) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    this.status = status;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    statusTime = System.currentTimeMillis();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    if (journalEnabled) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      journal.add(new StatusJournalEntryImpl(this.status, statusTime));<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>  protected void setState(State state) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    this.state = state;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    stateTime = System.currentTimeMillis();<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>  @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public void setDescription(String description) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.description = description;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  @Override<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  public void setWarnTime(long t) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    this.warnTime = t;<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>  @Override<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public void cleanup() {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (state == State.RUNNING) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      setState(State.ABORTED);<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>  /**<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * Force the completion timestamp backwards so that<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * it expires now.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   */<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  @Override<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  public void expireNow() {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    stateTime -= 180 * 1000;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  @Override<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  public Map&lt;String, Object&gt; toMap() {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    map.put("description", getDescription());<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    map.put("status", getStatus());<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    map.put("state", getState());<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    map.put("starttimems", getStartTime());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    map.put("statustimems", getCompletionTimestamp());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    map.put("statetimems", getCompletionTimestamp());<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return map;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  public String toJSON() throws IOException {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    return MAPPER.writeValueAsString(toMap());<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>  @Override<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  public String toString() {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    StringBuilder sb = new StringBuilder(512);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    sb.append(getDescription());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    sb.append(": status=");<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    sb.append(getStatus());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    sb.append(", state=");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    sb.append(getState());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    sb.append(", startTime=");<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    sb.append(getStartTime());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    sb.append(", completionTime=");<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    sb.append(getCompletionTimestamp());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    return sb.toString();<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>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * Returns the status journal. This implementation of status journal is not thread-safe. Currently<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * we use this to track various stages of flushes and compactions where we can use this/pretty<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * print for post task analysis, by which time we are already done changing states (writing to<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * journal)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public List&lt;StatusJournalEntry&gt; getStatusJournal() {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    if (journal == null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return Collections.emptyList();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    } else {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      return Collections.unmodifiableList(journal);<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>  /**<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * Enables journaling of this monitored task, the first invocation will lazily initialize the<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * journal. The journal implementation itself and this method are not thread safe<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void enableStatusJournal(boolean includeCurrentStatus) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    if (journalEnabled &amp;&amp; journal != null) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      return;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    journalEnabled = true;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    if (journal == null) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      journal = new ArrayList&lt;StatusJournalEntry&gt;();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    if (includeCurrentStatus) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      journal.add(new StatusJournalEntryImpl(status, statusTime));<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>  @Override<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public void disableStatusJournal() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    journalEnabled = false;<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>  @Override<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public String prettyPrintJournal() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return StringUtils.join("\n\t", getStatusJournal());<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>
 
 
 


[11/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.25

<TRUNCATED>

[15/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceL

<TRUNCATED>

[27/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html
index 1cc589f..cd936de 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html
@@ -142,7 +142,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredR
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></code></li>
 </ul>
 </li>
 </ul>
@@ -338,7 +338,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredR
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#abort-java.lang.String-">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#cleanup--">cleanup</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#expireNow--">expireNow</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getDescription--">getDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStartTime--">getStartTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getState--">getState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStateTime--">getStateTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/Mo
 nitoredTaskImpl.html#getStatusTime--">getStatusTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getWarnTime--">getWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#pause-java.lang.String-">pause</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#resume-java.lang.String-">resume</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setDescription-java.lang.String-">setDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setState-org.apache.hadoop.hbase.monitoring.MonitoredTask.State-">setState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setStatus-java.lang.String-">setStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setWarnTime-long-">setWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbas
 e/monitoring/MonitoredTaskImpl.html#toJSON--">toJSON</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#abort-java.lang.String-">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#cleanup--">cleanup</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#disableStatusJournal--">disableStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#enableStatusJournal-boolean-">enableStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#expireNow--">expireNow</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getDescription--">getDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStartTime--">getStartTime</a>, <a href="../../.
 ./../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getState--">getState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStateTime--">getStateTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatusJournal--">getStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatusTime--">getStatusTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getWarnTime--">getWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#pause-java.lang.String-">pause</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#prettyPrintJournal--">prettyPrintJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#resume-java.lang.String-">resume</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/Monitore
 dTaskImpl.html#setDescription-java.lang.String-">setDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setState-org.apache.hadoop.hbase.monitoring.MonitoredTask.State-">setState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setStatus-java.lang.String-">setStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setWarnTime-long-">setWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#toJSON--">toJSON</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -352,7 +352,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredR
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#abort-java.lang.String-">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#cleanup--">cleanup</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#expireNow--">expireNow</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getDescription--">getDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStartTime--">getStartTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getState--">getState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStateTime--">getStateTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusTime--
 ">getStatusTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getWarnTime--">getWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#pause-java.lang.String-">pause</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#resume-java.lang.String-">resume</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setDescription-java.lang.String-">setDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setStatus-java.lang.String-">setStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setWarnTime-long-">setWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toJSON--">toJSON</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#abort-java.lang.String-">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#cleanup--">cleanup</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#disableStatusJournal--">disableStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#enableStatusJournal-boolean-">enableStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#expireNow--">expireNow</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getDescription--">getDescription</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStartTime--">getStartTime</a>, <a href="../../../../../org/apache/hadoop/hbase/
 monitoring/MonitoredTask.html#getState--">getState</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStateTime--">getStateTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusJournal--">getStatusJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusTime--">getStatusTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getWarnTime--">getWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#pause-java.lang.String-">pause</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#prettyPrintJournal--">prettyPrintJournal</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#resume-java.lang.String-">resume</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setDescription-java.lang.String-">setDescription</a>,
  <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setStatus-java.lang.String-">setStatus</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setWarnTime-long-">setWarnTime</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toJSON--">toJSON</a></code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
index 5484014..da84c85 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" target="_top">Frames</a></li>
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.28">MonitoredTask.State</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.29">MonitoredTask.State</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&gt;</pre>
 </li>
 </ul>
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>RUNNING</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.29">RUNNING</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.30">RUNNING</a></pre>
 </li>
 </ul>
 <a name="WAITING">
@@ -225,7 +225,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>WAITING</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.30">WAITING</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.31">WAITING</a></pre>
 </li>
 </ul>
 <a name="COMPLETE">
@@ -234,7 +234,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>COMPLETE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.31">COMPLETE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.32">COMPLETE</a></pre>
 </li>
 </ul>
 <a name="ABORTED">
@@ -243,7 +243,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ABORTED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.32">ABORTED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.33">ABORTED</a></pre>
 </li>
 </ul>
 </li>
@@ -260,7 +260,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/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.80">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.85">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:
@@ -280,7 +280,7 @@ for (MonitoredTask.State c : MonitoredTask.State.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.80">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/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html#line.85">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 
@@ -325,7 +325,7 @@ not permitted.)</div>
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html
new file mode 100644
index 0000000..f7d9150
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html
@@ -0,0 +1,243 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>MonitoredTask.StatusJournalEntry (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="MonitoredTask.StatusJournalEntry (Apache HBase 3.0.0-SNAPSHOT API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":6,"i1":6};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/MonitoredTask.StatusJournalEntry.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTask.StatusJournalEntry.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
+<li>Constr&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
+<li>Constr&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.monitoring</div>
+<h2 title="Interface MonitoredTask.StatusJournalEntry" class="title">Interface MonitoredTask.StatusJournalEntry</h2>
+</div>
+<div class="contentContainer">
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Known Implementing Classes:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></dd>
+</dl>
+<dl>
+<dt>Enclosing interface:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></dd>
+</dl>
+<hr>
+<br>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.36">MonitoredTask.StatusJournalEntry</a></pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html#getStatus--">getStatus</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html#getTimeStamp--">getTimeStamp</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="getStatus--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getStatus</h4>
+<pre><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/monitoring/MonitoredTask.StatusJournalEntry.html#line.37">getStatus</a>()</pre>
+</li>
+</ul>
+<a name="getTimeStamp--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getTimeStamp</h4>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html#line.39">getTimeStamp</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/MonitoredTask.StatusJournalEntry.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTask.StatusJournalEntry.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
+<li>Constr&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
+<li>Constr&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.html b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
index fa570bc..a6e3d9a 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTask.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6,"i18":6,"i19":6};
+var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6,"i18":6,"i19":6,"i20":6,"i21":6,"i22":6,"i23":6};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public interface <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.27">MonitoredTask</a>
+public interface <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.28">MonitoredTask</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html?is-external=true" title="class or interface in java.lang">Cloneable</a></pre>
 </li>
 </ul>
@@ -138,6 +138,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static interface&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -173,71 +177,90 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#expireNow--">expireNow</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#disableStatusJournal--">disableStatusJournal</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#enableStatusJournal-boolean-">enableStatusJournal</a></span>(boolean&nbsp;includeCurrentStatus)</code>
+<div class="block">Enable journal that will store all statuses that have been set along with the time stamps when
+ they were set.</div>
+</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#expireNow--">expireNow</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getCompletionTimestamp--">getCompletionTimestamp</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getDescription--">getDescription</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStartTime--">getStartTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getState--">getState</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStateTime--">getStateTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatus--">getStatus</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i12" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusJournal--">getStatusJournal</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusTime--">getStatusTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getWarnTime--">getWarnTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" 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/monitoring/MonitoredTask.html#markComplete-java.lang.String-">markComplete</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="i13" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#pause-java.lang.String-">pause</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="i14" class="altColor">
+<tr id="i17" class="rowColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#prettyPrintJournal--">prettyPrintJournal</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#resume-java.lang.String-">resume</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="i15" class="rowColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setDescription-java.lang.String-">setDescription</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;description)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<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/monitoring/MonitoredTask.html#setStatus-java.lang.String-">setStatus</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;status)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setWarnTime-long-">setWarnTime</a></span>(long&nbsp;t)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toJSON--">toJSON</a></span>()</code>
 <div class="block">Creates a JSON object for parseable exposure of monitored tasks.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toMap--">toMap</a></span>()</code>
 <div class="block">Creates a string map of internal details for extensible exposure of 
@@ -265,7 +288,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartTime</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.35">getStartTime</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.42">getStartTime</a>()</pre>
 </li>
 </ul>
 <a name="getDescription--">
@@ -274,7 +297,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getDescription</h4>
-<pre><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/monitoring/MonitoredTask.html#line.36">getDescription</a>()</pre>
+<pre><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/monitoring/MonitoredTask.html#line.43">getDescription</a>()</pre>
 </li>
 </ul>
 <a name="getStatus--">
@@ -283,7 +306,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getStatus</h4>
-<pre><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/monitoring/MonitoredTask.html#line.37">getStatus</a>()</pre>
+<pre><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/monitoring/MonitoredTask.html#line.44">getStatus</a>()</pre>
 </li>
 </ul>
 <a name="getStatusTime--">
@@ -292,7 +315,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getStatusTime</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.38">getStatusTime</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.45">getStatusTime</a>()</pre>
 </li>
 </ul>
 <a name="getState--">
@@ -301,7 +324,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.39">getState</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.46">getState</a>()</pre>
 </li>
 </ul>
 <a name="getStateTime--">
@@ -310,7 +333,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateTime</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.40">getStateTime</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.47">getStateTime</a>()</pre>
 </li>
 </ul>
 <a name="getCompletionTimestamp--">
@@ -319,7 +342,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompletionTimestamp</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.41">getCompletionTimestamp</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.48">getCompletionTimestamp</a>()</pre>
 </li>
 </ul>
 <a name="getWarnTime--">
@@ -328,7 +351,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getWarnTime</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.42">getWarnTime</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.49">getWarnTime</a>()</pre>
 </li>
 </ul>
 <a name="markComplete-java.lang.String-">
@@ -337,7 +360,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>markComplete</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.44">markComplete</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>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.51">markComplete</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="pause-java.lang.String-">
@@ -346,7 +369,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>pause</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.45">pause</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>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.52">pause</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="resume-java.lang.String-">
@@ -355,7 +378,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>resume</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.46">resume</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>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.53">resume</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="abort-java.lang.String-">
@@ -364,7 +387,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.47">abort</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>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.54">abort</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="expireNow--">
@@ -373,7 +396,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>expireNow</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.48">expireNow</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.55">expireNow</a>()</pre>
 </li>
 </ul>
 <a name="setStatus-java.lang.String-">
@@ -382,7 +405,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>setStatus</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.50">setStatus</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;status)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.57">setStatus</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;status)</pre>
 </li>
 </ul>
 <a name="setDescription-java.lang.String-">
@@ -391,7 +414,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>setDescription</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.51">setDescription</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;description)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.58">setDescription</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;description)</pre>
 </li>
 </ul>
 <a name="setWarnTime-long-">
@@ -400,7 +423,49 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>setWarnTime</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.52">setWarnTime</a>(long&nbsp;t)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.59">setWarnTime</a>(long&nbsp;t)</pre>
+</li>
+</ul>
+<a name="getStatusJournal--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getStatusJournal</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;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.61">getStatusJournal</a>()</pre>
+</li>
+</ul>
+<a name="enableStatusJournal-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>enableStatusJournal</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.68">enableStatusJournal</a>(boolean&nbsp;includeCurrentStatus)</pre>
+<div class="block">Enable journal that will store all statuses that have been set along with the time stamps when
+ they were set.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>includeCurrentStatus</code> - whether to include the current set status in the journal</dd>
+</dl>
+</li>
+</ul>
+<a name="disableStatusJournal--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>disableStatusJournal</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.70">disableStatusJournal</a>()</pre>
+</li>
+</ul>
+<a name="prettyPrintJournal--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>prettyPrintJournal</h4>
+<pre><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/monitoring/MonitoredTask.html#line.72">prettyPrintJournal</a>()</pre>
 </li>
 </ul>
 <a name="cleanup--">
@@ -409,7 +474,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanup</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.58">cleanup</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.78">cleanup</a>()</pre>
 <div class="block">Explicitly mark this status as able to be cleaned up,
  even though it might not be complete.</div>
 </li>
@@ -420,7 +485,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>clone</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.65">clone</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.85">clone</a>()</pre>
 <div class="block">Public exposure of Object.clone() in order to allow clients to easily 
  capture current state.</div>
 <dl>
@@ -435,7 +500,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockList">
 <li class="blockList">
 <h4>toMap</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.72">toMap</a>()
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTask.html#line.92">toMap</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">Creates a string map of internal details for extensible exposure of 
  monitored tasks.</div>
@@ -453,7 +518,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toJSON</h4>
-<pre><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/monitoring/MonitoredTask.html#line.78">toJSON</a>()
+<pre><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/monitoring/MonitoredTask.html#line.98">toJSON</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">Creates a JSON object for parseable exposure of monitored tasks.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html
new file mode 100644
index 0000000..8b5c1f5
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html
@@ -0,0 +1,370 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>MonitoredTaskImpl.StatusJournalEntryImpl (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="MonitoredTaskImpl.StatusJournalEntryImpl (Apache HBase 3.0.0-SNAPSHOT API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":10,"i2":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/StateDumpServlet.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.monitoring</div>
+<h2 title="Class MonitoredTaskImpl.StatusJournalEntryImpl" class="title">Class MonitoredTaskImpl.StatusJournalEntryImpl</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.StatusJournalEntryImpl</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></dd>
+</dl>
+<dl>
+<dt>Enclosing class:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a></dd>
+</dl>
+<hr>
+<br>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.57">MonitoredTaskImpl.StatusJournalEntryImpl</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/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#status">status</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#statusTime">statusTime</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#StatusJournalEntryImpl-java.lang.String-long-">StatusJournalEntryImpl</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;status,
+                      long&nbsp;statusTime)</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#getStatus--">getStatus</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#getTimeStamp--">getTimeStamp</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#toString--">toString</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;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">Object</a></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="statusTime">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>statusTime</h4>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#line.58">statusTime</a></pre>
+</li>
+</ul>
+<a name="status">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>status</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/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#line.59">status</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="StatusJournalEntryImpl-java.lang.String-long-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>StatusJournalEntryImpl</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#line.61">StatusJournalEntryImpl</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;status,
+                              long&nbsp;statusTime)</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="getStatus--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getStatus</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/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#line.67">getStatus</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html#getStatus--">getStatus</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="getTimeStamp--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getTimeStamp</h4>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#line.72">getTimeStamp</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html#getTimeStamp--">getTimeStamp</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="toString--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<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/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html#line.77">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>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/StateDumpServlet.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>


[22/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
index 8c494308..1830296 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -3235,7 +3235,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>FOR_UNIT_TESTS_ONLY</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2915">FOR_UNIT_TESTS_ONLY</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2921">FOR_UNIT_TESTS_ONLY</a></pre>
 <div class="block">Row needed by below method.</div>
 </li>
 </ul>
@@ -3245,7 +3245,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <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/HRegion.html#line.8022">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8028">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -3254,7 +3254,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8039">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8045">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="MOCKED_LIST">
@@ -3263,7 +3263,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MOCKED_LIST</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8434">MOCKED_LIST</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8440">MOCKED_LIST</a></pre>
 <div class="block">A mocked list implementation - discards all updates.</div>
 </li>
 </ul>
@@ -4552,7 +4552,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2187">flush</a>(boolean&nbsp;force)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2191">flush</a>(boolean&nbsp;force)
                           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">Flush the cache.
 
@@ -4584,7 +4584,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>flushcache</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2234">flushcache</a>(boolean&nbsp;forceFlushAllStores,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2238">flushcache</a>(boolean&nbsp;forceFlushAllStores,
                                           boolean&nbsp;writeFlushRequestWalMarker,
                                           <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)
                                    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>
@@ -4621,7 +4621,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldFlushStore</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2317">shouldFlushStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store)</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2323">shouldFlushStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store)</pre>
 <div class="block">Should the store be flushed because it is old enough.
  <p>
  Every FlushPolicy should call this to determine whether a store is old enough to flush (except
@@ -4635,7 +4635,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldFlush</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2346">shouldFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;whyFlush)</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2352">shouldFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;whyFlush)</pre>
 <div class="block">Should the memstore be flushed now</div>
 </li>
 </ul>
@@ -4645,7 +4645,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>internalFlushcache</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2383">internalFlushcache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2389">internalFlushcache</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">Flushing all stores.</div>
 <dl>
@@ -4662,7 +4662,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>internalFlushcache</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2391">internalFlushcache</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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;storesToFlush,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2397">internalFlushcache</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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;storesToFlush,
                                                    <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status,
                                                    boolean&nbsp;writeFlushWalMarker,
                                                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)
@@ -4682,7 +4682,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>internalFlushcache</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2415">internalFlushcache</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2421">internalFlushcache</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                                                      long&nbsp;myseqid,
                                                      <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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;storesToFlush,
                                                      <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status,
@@ -4718,7 +4718,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>internalPrepareFlushCache</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2429">internalPrepareFlushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2435">internalPrepareFlushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                                                                long&nbsp;myseqid,
                                                                <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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;storesToFlush,
                                                                <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status,
@@ -4737,7 +4737,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>logFatLineOnFlush</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2569">logFatLineOnFlush</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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;storesToFlush,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2575">logFatLineOnFlush</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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;storesToFlush,
                                long&nbsp;sequenceId)</pre>
 <div class="block">Utility method broken out of internalPrepareFlushCache so that method is smaller.</div>
 </li>
@@ -4748,7 +4748,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doAbortFlushToWAL</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2597">doAbortFlushToWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2603">doAbortFlushToWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                                long&nbsp;flushOpSeqId,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&gt;&nbsp;committedFiles)</pre>
 </li>
@@ -4759,7 +4759,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doSyncOfUnflushedWALChanges</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2617">doSyncOfUnflushedWALChanges</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2623">doSyncOfUnflushedWALChanges</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                                                 <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&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></pre>
 <div class="block">Sync unflushed WAL changes. See HBASE-8208 for details</div>
@@ -4775,7 +4775,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>isAllFamilies</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2633">isAllFamilies</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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;families)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2639">isAllFamilies</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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;families)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if passed Set is all families in the region.</dd>
@@ -4788,7 +4788,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>writeFlushRequestMarkerToWAL</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2643">writeFlushRequestMarkerToWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2649">writeFlushRequestMarkerToWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                                              boolean&nbsp;writeFlushWalMarker)</pre>
 <div class="block">Writes a marker to WAL indicating a flush is requested but cannot be complete due to various
  reasons. Ignores exceptions from WAL. Returns whether the write succeeded.</div>
@@ -4806,7 +4806,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>internalFlushCacheAndCommit</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2661">internalFlushCacheAndCommit</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2667">internalFlushCacheAndCommit</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                                                               <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status,
                                                               <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;prepareResult,
                                                               <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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;&nbsp;storesToFlush)
@@ -4823,7 +4823,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextSequenceId</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2818">getNextSequenceId</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal)
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2824">getNextSequenceId</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal)
                           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">Method to safely get the next sequence number.</div>
 <dl>
@@ -4840,7 +4840,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanner</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2829">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/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2835">getScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
                                      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/Region.html#getScanner-org.apache.hadoop.hbase.client.Scan-">Region</a></code></span></div>
 <div class="block">Return an iterator that scans over the HRegion, returning the indicated
@@ -4865,7 +4865,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanner</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2834">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/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2840">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/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;additionalScanners)
                                      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/Region.html#getScanner-org.apache.hadoop.hbase.client.Scan-java.util.List-">Region</a></code></span></div>
@@ -4894,7 +4894,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2839">getScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2845">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/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;additionalScanners,
                                              long&nbsp;nonceGroup,
                                              long&nbsp;nonce)
@@ -4911,7 +4911,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>instantiateRegionScanner</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2860">instantiateRegionScanner</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/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2866">instantiateRegionScanner</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/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;additionalScanners)
                                           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>
@@ -4926,7 +4926,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>instantiateRegionScanner</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2866">instantiateRegionScanner</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/HRegion.RegionScannerImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RegionScannerImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2872">instantiateRegionScanner</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/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;additionalScanners,
                                                              long&nbsp;nonceGroup,
                                                              long&nbsp;nonce)
@@ -4943,7 +4943,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareDelete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2882">prepareDelete</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a>&nbsp;delete)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2888">prepareDelete</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a>&nbsp;delete)
                    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">Prepare a delete for a row mutation processor</div>
 <dl>
@@ -4960,7 +4960,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2900">delete</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a>&nbsp;delete)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2906">delete</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a>&nbsp;delete)
             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/Region.html#delete-org.apache.hadoop.hbase.client.Delete-">Region</a></code></span></div>
 <div class="block">Deletes the specified cells/row.</div>
@@ -4978,7 +4978,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2922">delete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2928">delete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
             <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;durability)
      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 is used only by unit tests. Not required to be a public API.</div>
@@ -4996,7 +4996,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareDeleteTimestamps</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2938">prepareDeleteTimestamps</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2944">prepareDeleteTimestamps</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                                     byte[]&nbsp;byteNow)
                              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>
@@ -5018,7 +5018,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>updateDeleteLatestVersionTimestamp</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2982">updateDeleteLatestVersionTimestamp</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2988">updateDeleteLatestVersionTimestamp</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                                         <a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
                                         int&nbsp;count,
                                         byte[]&nbsp;byteNow)
@@ -5035,7 +5035,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2999">put</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;put)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3005">put</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;put)
          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/Region.html#put-org.apache.hadoop.hbase.client.Put-">Region</a></code></span></div>
 <div class="block">Puts some data in the table.</div>
@@ -5053,7 +5053,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>batchMutate</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3874">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;mutations,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3880">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;mutations,
                                      long&nbsp;nonceGroup,
                                      long&nbsp;nonce)
                               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>
@@ -5069,7 +5069,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>batchMutate</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3879">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;mutations,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3885">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;mutations,
                                      boolean&nbsp;atomic,
                                      long&nbsp;nonceGroup,
                                      long&nbsp;nonce)
@@ -5086,7 +5086,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>batchMutate</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3889">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;mutations)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3895">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;mutations)
                               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/Region.html#batchMutate-org.apache.hadoop.hbase.client.Mutation:A-">Region</a></code></span></div>
 <div class="block">Perform a batch of mutations.
@@ -5111,7 +5111,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>batchReplay</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3893">batchReplay</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>[]&nbsp;mutations,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3899">batchReplay</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>[]&nbsp;mutations,
                                      long&nbsp;replaySeqId)
                               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>
@@ -5126,7 +5126,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>batchMutate</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3937">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;?&gt;&nbsp;batchOp)
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3943">batchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;?&gt;&nbsp;batchOp)
                        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">Perform a batch of mutations.
 
@@ -5158,7 +5158,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doMiniBatchMutate</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3968">doMiniBatchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;?&gt;&nbsp;batchOp)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3974">doMiniBatchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;?&gt;&nbsp;batchOp)
                         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">Called to do a piece of the batch that came in to <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#batchMutate-org.apache.hadoop.hbase.client.Mutation:A-long-long-"><code>batchMutate(Mutation[], long, long)</code></a>
  In here we also handle replay of edits on region recover.</div>
@@ -5174,7 +5174,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getEffectiveDurability</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4056">getEffectiveDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4062">getEffectiveDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block">Returns effective durability from the passed durability and
  the table descriptor.</div>
 </li>
@@ -5185,7 +5185,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndMutate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4061">checkAndMutate</a>(byte[]&nbsp;row,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4067">checkAndMutate</a>(byte[]&nbsp;row,
                               byte[]&nbsp;family,
                               byte[]&nbsp;qualifier,
                               <a href="../../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase">CompareOperator</a>&nbsp;op,
@@ -5222,7 +5222,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndRowMutate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4068">checkAndRowMutate</a>(byte[]&nbsp;row,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4074">checkAndRowMutate</a>(byte[]&nbsp;row,
                                  byte[]&nbsp;family,
                                  byte[]&nbsp;qualifier,
                                  <a href="../../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase">CompareOperator</a>&nbsp;op,
@@ -5259,7 +5259,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doCheckAndRowMutate</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4077">doCheckAndRowMutate</a>(byte[]&nbsp;row,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4083">doCheckAndRowMutate</a>(byte[]&nbsp;row,
                                     byte[]&nbsp;family,
                                     byte[]&nbsp;qualifier,
                                     <a href="../../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase">CompareOperator</a>&nbsp;op,
@@ -5282,7 +5282,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkMutationType</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4176">checkMutationType</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4182">checkMutationType</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                                byte[]&nbsp;row)
                         throws <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.html" title="class in org.apache.hadoop.hbase">DoNotRetryIOException</a></pre>
 <dl>
@@ -5297,7 +5297,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>matches</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4187">matches</a>(<a href="../../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase">CompareOperator</a>&nbsp;op,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4193">matches</a>(<a href="../../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase">CompareOperator</a>&nbsp;op,
                         int&nbsp;compareResult)</pre>
 </li>
 </ul>
@@ -5307,7 +5307,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doBatchMutate</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4215">doBatchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4221">doBatchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation)
                     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>
@@ -5321,7 +5321,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionToSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4240">addRegionToSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4246">addRegionToSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc,
                                 <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;exnSnare)
                          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">Complete taking the snapshot on the region. Writes the region info and adds references to the
@@ -5346,7 +5346,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>updateSequenceId</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4250">updateSequenceId</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="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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;cellItr,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4256">updateSequenceId</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="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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;cellItr,
                               long&nbsp;sequenceId)
                        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>
@@ -5361,7 +5361,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCellTimestamps</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4266">updateCellTimestamps</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="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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;cellItr,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4272">updateCellTimestamps</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="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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;cellItr,
                                          byte[]&nbsp;now)
                                   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">Replace any cell timestamps set to <a href="../../../../../org/apache/hadoop/hbase/HConstants.html#LATEST_TIMESTAMP"><code>HConstants.LATEST_TIMESTAMP</code></a>
@@ -5381,7 +5381,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>rewriteCellTags</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4283">rewriteCellTags</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4289">rewriteCellTags</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                      <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;m)</pre>
 <div class="block">Possibly rewrite incoming cell tags.</div>
 </li>
@@ -5392,7 +5392,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkResources</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4311">checkResources</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4317">checkResources</a>()
              throws <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -5406,7 +5406,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkReadOnly</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4333">checkReadOnly</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4339">checkReadOnly</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>
@@ -5420,7 +5420,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkReadsEnabled</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4339">checkReadsEnabled</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4345">checkReadsEnabled</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>
@@ -5434,7 +5434,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>setReadsEnabled</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4346">setReadsEnabled</a>(boolean&nbsp;readsEnabled)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4352">setReadsEnabled</a>(boolean&nbsp;readsEnabled)</pre>
 </li>
 </ul>
 <a name="put-byte:A-byte:A-java.util.List-">
@@ -5443,7 +5443,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4359">put</a>(byte[]&nbsp;row,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4365">put</a>(byte[]&nbsp;row,
          byte[]&nbsp;family,
          <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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;edits)
   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>
@@ -5464,7 +5464,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>applyToMemStore</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4375">applyToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4381">applyToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                              <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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
                              boolean&nbsp;delta,
                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreAccounting)
@@ -5487,7 +5487,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>applyToMemStore</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4389">applyToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4395">applyToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                              <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreAccounting)
                       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>
@@ -5505,7 +5505,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4404">checkFamilies</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;byte[]&gt;&nbsp;families)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4410">checkFamilies</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;byte[]&gt;&nbsp;families)
                    throws <a href="../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver">NoSuchColumnFamilyException</a></pre>
 <div class="block">Check the collection of families for validity.</div>
 <dl>
@@ -5522,7 +5522,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTimestamps</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4416">checkTimestamps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4422">checkTimestamps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                             long&nbsp;now)
                      throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/FailedSanityCheckException.html" title="class in org.apache.hadoop.hbase.exceptions">FailedSanityCheckException</a></pre>
 <div class="block">Check the collection of families for valid timestamps</div>
@@ -5541,7 +5541,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>isFlushSize</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4443">isFlushSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;size)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4449">isFlushSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;size)</pre>
 </li>
 </ul>
 <a name="replayRecoveredEditsIfAny-org.apache.hadoop.fs.Path-java.util.Map-org.apache.hadoop.hbase.util.CancelableProgressable-org.apache.hadoop.hbase.monitoring.MonitoredTask-">
@@ -5550,7 +5550,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayRecoveredEditsIfAny</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4480">replayRecoveredEditsIfAny</a>(org.apache.hadoop.fs.Path&nbsp;regiondir,
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4486">replayRecoveredEditsIfAny</a>(org.apache.hadoop.fs.Path&nbsp;regiondir,
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;maxSeqIdInStores,
                                          <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter,
                                          <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
@@ -5598,7 +5598,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayRecoveredEdits</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4588">replayRecoveredEdits</a>(org.apache.hadoop.fs.Path&nbsp;edits,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4594">replayRecoveredEdits</a>(org.apache.hadoop.fs.Path&nbsp;edits,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;maxSeqIdInStores,
                                   <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>
@@ -5614,7 +5614,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALCompactionMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4795">replayWALCompactionMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4801">replayWALCompactionMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
                                boolean&nbsp;pickCompactionFiles,
                                boolean&nbsp;removeFiles,
                                long&nbsp;replaySeqId)
@@ -5634,7 +5634,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4856">replayWALFlushMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4862">replayWALFlushMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
                           long&nbsp;replaySeqId)
                    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>
@@ -5649,7 +5649,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushStartMarker</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4903">replayWALFlushStartMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4909">replayWALFlushStartMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
                                               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">Replay the flush marker from primary region by creating a corresponding snapshot of
  the store memstores, only if the memstores do not have a higher seqId from an earlier wal
@@ -5666,7 +5666,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushCommitMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5016">replayWALFlushCommitMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5022">replayWALFlushCommitMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
                          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>
@@ -5680,7 +5680,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayFlushInStores</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5140">replayFlushInStores</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5146">replayFlushInStores</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
                                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;prepareFlushResult,
                                  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>
@@ -5702,7 +5702,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>dropMemStoreContentsForSeqId</h4>
-<pre>private&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/HRegion.html#line.5181">dropMemStoreContentsForSeqId</a>(long&nbsp;seqId,
+<pre>private&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/HRegion.html#line.5187">dropMemStoreContentsForSeqId</a>(long&nbsp;seqId,
                                                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store)
                                            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">Drops the memstore contents after replaying a flush descriptor or region open event replay
@@ -5719,7 +5719,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doDropStoreMemStoreContentsForSeqId</h4>
-<pre>private&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/HRegion.html#line.5212">doDropStoreMemStoreContentsForSeqId</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;s,
+<pre>private&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/HRegion.html#line.5218">doDropStoreMemStoreContentsForSeqId</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;s,
                                                          long&nbsp;currentSeqId)
                                                   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>
@@ -5734,7 +5734,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushAbortMarker</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5222">replayWALFlushAbortMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5228">replayWALFlushAbortMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)</pre>
 </li>
 </ul>
 <a name="replayWALFlushCannotFlushMarker-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor-long-">
@@ -5743,7 +5743,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushCannotFlushMarker</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5228">replayWALFlushCannotFlushMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5234">replayWALFlushCannotFlushMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
                                              long&nbsp;replaySeqId)</pre>
 </li>
 </ul>
@@ -5753,7 +5753,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getPrepareFlushResult</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5248">getPrepareFlushResult</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5254">getPrepareFlushResult</a>()</pre>
 </li>
 </ul>
 <a name="replayWALRegionEventMarker-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor-">
@@ -5762,7 +5762,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALRegionEventMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5254">replayWALRegionEventMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor&nbsp;regionEvent)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5260">replayWALRegionEventMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor&nbsp;regionEvent)
                          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>
@@ -5776,7 +5776,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALBulkLoadEventMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5370">replayWALBulkLoadEventMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescriptor&nbsp;bulkLoadEvent)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5376">replayWALBulkLoadEventMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescriptor&nbsp;bulkLoadEvent)
                            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>
@@ -5790,7 +5790,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>dropPrepareFlushIfPossible</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5453">dropPrepareFlushIfPossible</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5459">dropPrepareFlushIfPossible</a>()</pre>
 <div class="block">If all stores ended up dropping their snapshots, we can safely drop the prepareFlushResult</div>
 </li>
 </ul>
@@ -5800,7 +5800,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5480">refreshStoreFiles</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5486">refreshStoreFiles</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/Region.html#refreshStoreFiles--">Region</a></code></span></div>
 <div class="block">Check the region's underlying store files, open the files that have not
@@ -5820,7 +5820,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5486">refreshStoreFiles</a>(boolean&nbsp;force)
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5492">refreshStoreFiles</a>(boolean&nbsp;force)
                              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>
@@ -5834,7 +5834,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>logRegionFiles</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5577">logRegionFiles</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5583">logRegionFiles</a>()</pre>
 </li>
 </ul>
 <a name="checkTargetRegion-byte:A-java.lang.String-java.lang.Object-">
@@ -5843,7 +5843,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTargetRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5589">checkTargetRegion</a>(byte[]&nbsp;encodedRegionName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5595">checkTargetRegion</a>(byte[]&nbsp;encodedRegionName,
                                <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;exceptionMsg,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;payload)
                         throws <a href="../../../../../org/apache/hadoop/hbase/regionserver/WrongRegionException.html" title="class in org.apache.hadoop.hbase.regionserver">WrongRegionException</a></pre>
@@ -5861,7 +5861,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreEdit</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5612">restoreEdit</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;s,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5618">restoreEdit</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver

<TRUNCATED>

[26/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
index dc903ef..1bd01b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -49,8 +49,8 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/StateDumpServlet.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" target="_top">Frames</a></li>
@@ -74,7 +74,7 @@ var activeTableTab = "activeTableTab";
 <div>
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
-<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
 <li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-class <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.29">MonitoredTaskImpl</a>
+class <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.34">MonitoredTaskImpl</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/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></pre>
 </li>
@@ -133,12 +133,23 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <!--   -->
 </a>
 <h3>Nested Class Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
+<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Class and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></span></code>&nbsp;</td>
+</tr>
+</table>
 <ul class="blockList">
 <li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.monitoring.MonitoredTask">
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>, <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></code></li>
 </ul>
 </li>
 </ul>
@@ -159,6 +170,14 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#description">description</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#journal">journal</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#journalEnabled">journalEnabled</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static com.fasterxml.jackson.databind.ObjectMapper</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#MAPPER">MAPPER</a></span></code>&nbsp;</td>
 </tr>
@@ -238,85 +257,106 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#disableStatusJournal--">disableStatusJournal</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#enableStatusJournal-boolean-">enableStatusJournal</a></span>(boolean&nbsp;includeCurrentStatus)</code>
+<div class="block">Enables journaling of this monitored task, the first invocation will lazily initialize the
+ journal.</div>
+</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#expireNow--">expireNow</a></span>()</code>
 <div class="block">Force the completion timestamp backwards so that
  it expires now.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getCompletionTimestamp--">getCompletionTimestamp</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getDescription--">getDescription</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStartTime--">getStartTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getState--">getState</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStateTime--">getStateTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatus--">getStatus</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i12" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatusJournal--">getStatusJournal</a></span>()</code>
+<div class="block">Returns the status journal.</div>
+</td>
+</tr>
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatusTime--">getStatusTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getWarnTime--">getWarnTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" 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/monitoring/MonitoredTaskImpl.html#markComplete-java.lang.String-">markComplete</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;status)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#pause-java.lang.String-">pause</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="i14" class="altColor">
+<tr id="i17" class="rowColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#prettyPrintJournal--">prettyPrintJournal</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#resume-java.lang.String-">resume</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="i15" class="rowColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setDescription-java.lang.String-">setDescription</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;description)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setState-org.apache.hadoop.hbase.monitoring.MonitoredTask.State-">setState</a></span>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;state)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#setStatus-java.lang.String-">setStatus</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;status)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<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/monitoring/MonitoredTaskImpl.html#setWarnTime-long-">setWarnTime</a></span>(long&nbsp;t)</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#toJSON--">toJSON</a></span>()</code>
 <div class="block">Creates a JSON object for parseable exposure of monitored tasks.</div>
 </td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#toMap--">toMap</a></span>()</code>
 <div class="block">Creates a string map of internal details for extensible exposure of 
  monitored tasks.</div>
 </td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
@@ -348,7 +388,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>startTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.30">startTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.35">startTime</a></pre>
 </li>
 </ul>
 <a name="statusTime">
@@ -357,7 +397,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>statusTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.31">statusTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.36">statusTime</a></pre>
 </li>
 </ul>
 <a name="stateTime">
@@ -366,7 +406,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>stateTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.32">stateTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.37">stateTime</a></pre>
 </li>
 </ul>
 <a name="warnTime">
@@ -375,7 +415,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>warnTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.33">warnTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.38">warnTime</a></pre>
 </li>
 </ul>
 <a name="status">
@@ -384,7 +424,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>status</h4>
-<pre>private volatile&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/monitoring/MonitoredTaskImpl.html#line.35">status</a></pre>
+<pre>private volatile&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/monitoring/MonitoredTaskImpl.html#line.40">status</a></pre>
 </li>
 </ul>
 <a name="description">
@@ -393,7 +433,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>description</h4>
-<pre>private volatile&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/monitoring/MonitoredTaskImpl.html#line.36">description</a></pre>
+<pre>private volatile&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/monitoring/MonitoredTaskImpl.html#line.41">description</a></pre>
 </li>
 </ul>
 <a name="state">
@@ -402,7 +442,25 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>state</h4>
-<pre>protected volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.38">state</a></pre>
+<pre>protected volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.43">state</a></pre>
+</li>
+</ul>
+<a name="journalEnabled">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>journalEnabled</h4>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.45">journalEnabled</a></pre>
+</li>
+</ul>
+<a name="journal">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>journal</h4>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.46">journal</a></pre>
 </li>
 </ul>
 <a name="MAPPER">
@@ -411,7 +469,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MAPPER</h4>
-<pre>private static final&nbsp;com.fasterxml.jackson.databind.ObjectMapper <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.40">MAPPER</a></pre>
+<pre>private static final&nbsp;com.fasterxml.jackson.databind.ObjectMapper <a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.48">MAPPER</a></pre>
 </li>
 </ul>
 </li>
@@ -428,7 +486,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MonitoredTaskImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.42">MonitoredTaskImpl</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.50">MonitoredTaskImpl</a>()</pre>
 </li>
 </ul>
 </li>
@@ -445,7 +503,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>clone</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.50">clone</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.87">clone</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#clone--">MonitoredTask</a></code></span></div>
 <div class="block">Public exposure of Object.clone() in order to allow clients to easily 
  capture current state.</div>
@@ -465,7 +523,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.59">getStartTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.96">getStartTime</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStartTime--">getStartTime</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -478,7 +536,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getDescription</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/monitoring/MonitoredTaskImpl.html#line.64">getDescription</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/monitoring/MonitoredTaskImpl.html#line.101">getDescription</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getDescription--">getDescription</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -491,7 +549,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getStatus</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/monitoring/MonitoredTaskImpl.html#line.69">getStatus</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/monitoring/MonitoredTaskImpl.html#line.106">getStatus</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatus--">getStatus</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -504,7 +562,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getStatusTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.74">getStatusTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.111">getStatusTime</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusTime--">getStatusTime</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -517,7 +575,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.79">getState</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.116">getState</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getState--">getState</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -530,7 +588,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.84">getStateTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.121">getStateTime</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStateTime--">getStateTime</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -543,7 +601,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getWarnTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.89">getWarnTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.126">getWarnTime</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getWarnTime--">getWarnTime</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -556,7 +614,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompletionTimestamp</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.94">getCompletionTimestamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.131">getCompletionTimestamp</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getCompletionTimestamp--">getCompletionTimestamp</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -569,7 +627,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>markComplete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.102">markComplete</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;status)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.139">markComplete</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;status)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#markComplete-java.lang.String-">markComplete</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -582,7 +640,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>pause</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.108">pause</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&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.145">pause</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>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#pause-java.lang.String-">pause</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -595,7 +653,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>resume</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.114">resume</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&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.151">resume</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>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#resume-java.lang.String-">resume</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -608,7 +666,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.120">abort</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&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.157">abort</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>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#abort-java.lang.String-">abort</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -621,7 +679,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>setStatus</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.126">setStatus</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;status)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.163">setStatus</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;status)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setStatus-java.lang.String-">setStatus</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -634,7 +692,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>setState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.131">setState</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;state)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.171">setState</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;state)</pre>
 </li>
 </ul>
 <a name="setDescription-java.lang.String-">
@@ -643,7 +701,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>setDescription</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.137">setDescription</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;description)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.177">setDescription</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;description)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setDescription-java.lang.String-">setDescription</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -656,7 +714,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>setWarnTime</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.142">setWarnTime</a>(long&nbsp;t)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.182">setWarnTime</a>(long&nbsp;t)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#setWarnTime-long-">setWarnTime</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
@@ -669,7 +727,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.147">cleanup</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.187">cleanup</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#cleanup--">MonitoredTask</a></code></span></div>
 <div class="block">Explicitly mark this status as able to be cleaned up,
  even though it might not be complete.</div>
@@ -685,7 +743,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>expireNow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.158">expireNow</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.198">expireNow</a>()</pre>
 <div class="block">Force the completion timestamp backwards so that
  it expires now.</div>
 <dl>
@@ -700,7 +758,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>toMap</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.163">toMap</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.203">toMap</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#toMap--">MonitoredTask</a></code></span></div>
 <div class="block">Creates a string map of internal details for extensible exposure of 
  monitored tasks.</div>
@@ -718,7 +776,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <ul class="blockList">
 <li class="blockList">
 <h4>toJSON</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/monitoring/MonitoredTaskImpl.html#line.175">toJSON</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.215">toJSON</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/monitoring/MonitoredTask.html#toJSON--">MonitoredTask</a></code></span></div>
 <div class="block">Creates a JSON object for parseable exposure of monitored tasks.</div>
@@ -735,16 +793,76 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <a name="toString--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<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/monitoring/MonitoredTaskImpl.html#line.180">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/monitoring/MonitoredTaskImpl.html#line.220">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>
 </dl>
 </li>
 </ul>
+<a name="getStatusJournal--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getStatusJournal</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/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.241">getStatusJournal</a>()</pre>
+<div class="block">Returns the status journal. This implementation of status journal is not thread-safe. Currently
+ we use this to track various stages of flushes and compactions where we can use this/pretty
+ print for post task analysis, by which time we are already done changing states (writing to
+ journal)</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusJournal--">getStatusJournal</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="enableStatusJournal-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>enableStatusJournal</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.254">enableStatusJournal</a>(boolean&nbsp;includeCurrentStatus)</pre>
+<div class="block">Enables journaling of this monitored task, the first invocation will lazily initialize the
+ journal. The journal implementation itself and this method are not thread safe</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#enableStatusJournal-boolean-">enableStatusJournal</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>includeCurrentStatus</code> - whether to include the current set status in the journal</dd>
+</dl>
+</li>
+</ul>
+<a name="disableStatusJournal--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>disableStatusJournal</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#line.268">disableStatusJournal</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#disableStatusJournal--">disableStatusJournal</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="prettyPrintJournal--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>prettyPrintJournal</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/monitoring/MonitoredTaskImpl.html#line.273">prettyPrintJournal</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#prettyPrintJournal--">prettyPrintJournal</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>
@@ -773,8 +891,8 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/StateDumpServlet.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" target="_top">Frames</a></li>
@@ -798,7 +916,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredT
 <div>
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
-<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
 <li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/StateDumpServlet.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/StateDumpServlet.html b/devapidocs/org/apache/hadoop/hbase/monitoring/StateDumpServlet.html
index 9a62e2f..0a81a5d 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/StateDumpServlet.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/StateDumpServlet.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -366,7 +366,7 @@ extends javax.servlet.http.HttpServlet</pre>
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.StatusJournalEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.StatusJournalEntry.html b/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.StatusJournalEntry.html
new file mode 100644
index 0000000..cc09763
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.StatusJournalEntry.html
@@ -0,0 +1,197 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Interface org.apache.hadoop.hbase.monitoring.MonitoredTask.StatusJournalEntry (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Interface org.apache.hadoop.hbase.monitoring.MonitoredTask.StatusJournalEntry (Apache HBase 3.0.0-SNAPSHOT API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.StatusJournalEntry.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTask.StatusJournalEntry.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Interface org.apache.hadoop.hbase.monitoring.MonitoredTask.StatusJournalEntry" class="title">Uses of Interface<br>org.apache.hadoop.hbase.monitoring.MonitoredTask.StatusJournalEntry</h2>
+</div>
+<div class="classUseContainer">
+<ul class="blockList">
+<li class="blockList">
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing packages, and an explanation">
+<caption><span>Packages that use <a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Package</th>
+<th class="colLast" scope="col">Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.monitoring">org.apache.hadoop.hbase.monitoring</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<ul class="blockList">
+<li class="blockList"><a name="org.apache.hadoop.hbase.monitoring">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a> in <a href="../../../../../../org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing classes, and an explanation">
+<caption><span>Classes in <a href="../../../../../../org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a> that implement <a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Class and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></span></code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
+<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a> with type parameters of type <a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">MonitoredTaskImpl.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#journal">journal</a></span></code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/monitoring/package-summary.html">org.apache.hadoop.hbase.monitoring</a> that return types with arguments of type <a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code><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/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">MonitoredTask.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html#getStatusJournal--">getStatusJournal</a></span>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">MonitoredTaskImpl.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.html#getStatusJournal--">getStatusJournal</a></span>()</code>
+<div class="block">Returns the status journal.</div>
+</td>
+</tr>
+</tbody>
+</table>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.StatusJournalEntry.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTask.StatusJournalEntry.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html b/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html
new file mode 100644
index 0000000..2571f80
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.StatusJournalEntryImpl (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.StatusJournalEntryImpl (Apache HBase 3.0.0-SNAPSHOT API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.StatusJournalEntryImpl" class="title">Uses of Class<br>org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.StatusJournalEntryImpl</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.StatusJournalEntryImpl</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">Frames</a></li>
+<li><a href="MonitoredTaskImpl.StatusJournalEntryImpl.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/package-frame.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-frame.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-frame.html
index c3199bb..0ed7b5a 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-frame.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-frame.html
@@ -15,6 +15,7 @@
 <ul title="Interfaces">
 <li><a href="MonitoredRPCHandler.html" title="interface in org.apache.hadoop.hbase.monitoring" target="classFrame"><span class="interfaceName">MonitoredRPCHandler</span></a></li>
 <li><a href="MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring" target="classFrame"><span class="interfaceName">MonitoredTask</span></a></li>
+<li><a href="MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring" target="classFrame"><span class="interfaceName">MonitoredTask.StatusJournalEntry</span></a></li>
 <li><a href="TaskMonitor.TaskFilter.html" title="interface in org.apache.hadoop.hbase.monitoring" target="classFrame"><span class="interfaceName">TaskMonitor.TaskFilter</span></a></li>
 </ul>
 <h2 title="Classes">Classes</h2>
@@ -24,6 +25,7 @@
 <li><a href="MemoryBoundedLogMessageBuffer.LogMessage.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">MemoryBoundedLogMessageBuffer.LogMessage</a></li>
 <li><a href="MonitoredRPCHandlerImpl.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">MonitoredRPCHandlerImpl</a></li>
 <li><a href="MonitoredTaskImpl.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">MonitoredTaskImpl</a></li>
+<li><a href="MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">MonitoredTaskImpl.StatusJournalEntryImpl</a></li>
 <li><a href="StateDumpServlet.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">StateDumpServlet</a></li>
 <li><a href="TaskMonitor.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">TaskMonitor</a></li>
 <li><a href="TaskMonitor.PassthroughInvocationHandler.html" title="class in org.apache.hadoop.hbase.monitoring" target="classFrame">TaskMonitor.PassthroughInvocationHandler</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/package-summary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-summary.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-summary.html
index da29fd5..83c8767 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-summary.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-summary.html
@@ -94,6 +94,10 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.html" title="interface in org.apache.hadoop.hbase.monitoring">TaskMonitor.TaskFilter</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -138,30 +142,34 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/StateDumpServlet.html" title="class in org.apache.hadoop.hbase.monitoring">StateDumpServlet</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl.StatusJournalEntryImpl</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/StateDumpServlet.html" title="class in org.apache.hadoop.hbase.monitoring">StateDumpServlet</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.html" title="class in org.apache.hadoop.hbase.monitoring">TaskMonitor</a></td>
 <td class="colLast">
 <div class="block">Singleton which keeps track of tasks going on in this VM.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.PassthroughInvocationHandler.html" title="class in org.apache.hadoop.hbase.monitoring">TaskMonitor.PassthroughInvocationHandler</a>&lt;T&gt;</td>
 <td class="colLast">
 <div class="block">An InvocationHandler that simply passes through calls to the original 
  object.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskAndWeakRefPair.html" title="class in org.apache.hadoop.hbase.monitoring">TaskMonitor.TaskAndWeakRefPair</a></td>
 <td class="colLast">
 <div class="block">This class encapsulates an object as well as a weak reference to a proxy
  that passes through calls to that object.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/monitoring/ThreadMonitoring.html" title="class in org.apache.hadoop.hbase.monitoring">ThreadMonitoring</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 9eb46aa..4b549da 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -98,6 +98,7 @@
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredRPCHandlerImpl</span></a> (implements org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandler</a>)</li>
 </ul>
 </li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTaskImpl.StatusJournalEntryImpl</span></a> (implements org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.MonitorRunnable.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.MonitorRunnable</span></a> (implements java.lang.<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>)</li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.PassthroughInvocationHandler.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.PassthroughInvocationHandler</span></a>&lt;T&gt; (implements java.lang.reflect.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/InvocationHandler.html?is-external=true" title="class or interface in java.lang.reflect">InvocationHandler</a>)</li>
@@ -117,6 +118,7 @@
 </li>
 </ul>
 </li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.StatusJournalEntry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter</span></a></li>
 </ul>
 <h2 title="Enum Hierarchy">Enum Hierarchy</h2>
@@ -125,8 +127,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.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/monitoring/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-use.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-use.html
index 082ea39..388cc99 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-use.html
@@ -241,23 +241,26 @@
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.State.html#org.apache.hadoop.hbase.monitoring">MonitoredTask.State</a>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.html#org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a>&nbsp;</td>
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/MonitoredTask.StatusJournalEntry.html#org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/MonitoredTaskImpl.html#org.apache.hadoop.hbase.monitoring">MonitoredTaskImpl</a>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/TaskMonitor.html#org.apache.hadoop.hbase.monitoring">TaskMonitor</a>
 <div class="block">Singleton which keeps track of tasks going on in this VM.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/TaskMonitor.TaskAndWeakRefPair.html#org.apache.hadoop.hbase.monitoring">TaskMonitor.TaskAndWeakRefPair</a>
 <div class="block">This class encapsulates an object as well as a weak reference to a proxy
  that passes through calls to that object.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/TaskMonitor.TaskFilter.html#org.apache.hadoop.hbase.monitoring">TaskMonitor.TaskFilter</a>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/monitoring/class-use/TaskMonitor.TaskFilter.TaskType.html#org.apache.hadoop.hbase.monitoring">TaskMonitor.TaskFilter.TaskType</a>&nbsp;</td>
 </tr>
 </tbody>


[24/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
index 3259495..db892a3 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3453">HRegion.MutationBatchOperation</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3459">HRegion.MutationBatchOperation</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</pre>
 <div class="block">Batch of mutation operations. Base class is shared with <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver"><code>HRegion.ReplayBatchOperation</code></a> as most
  of the logic is same.</div>
@@ -342,7 +342,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>nonceGroup</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3454">nonceGroup</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3460">nonceGroup</a></pre>
 </li>
 </ul>
 <a name="nonce">
@@ -351,7 +351,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>nonce</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3455">nonce</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3461">nonce</a></pre>
 </li>
 </ul>
 </li>
@@ -368,7 +368,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MutationBatchOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3456">MutationBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3462">MutationBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                               <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;operations,
                               boolean&nbsp;atomic,
                               long&nbsp;nonceGroup,
@@ -389,7 +389,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutation</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3465">getMutation</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3471">getMutation</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutation-int-">getMutation</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -402,7 +402,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonceGroup</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3470">getNonceGroup</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3476">getNonceGroup</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonceGroup-int-">getNonceGroup</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -415,7 +415,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3475">getNonce</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3481">getNonce</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonce-int-">getNonce</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -428,7 +428,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutationsForCoprocs</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3480">getMutationsForCoprocs</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3486">getMutationsForCoprocs</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutationsForCoprocs--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">This method is potentially expensive and useful mostly for non-replay CP path.</div>
 <dl>
@@ -443,7 +443,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>isInReplay</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3485">isInReplay</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3491">isInReplay</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#isInReplay--">isInReplay</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -456,7 +456,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3490">getOrigLogSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3496">getOrigLogSeqNum</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getOrigLogSeqNum--">getOrigLogSeqNum</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -469,7 +469,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3495">startRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3501">startRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -485,7 +485,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3500">closeRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3506">closeRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -501,7 +501,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPreparePut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3505">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3511">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPreparePut-org.apache.hadoop.hbase.client.Put-">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Implement any Put request specific check and prepare logic here. Please refer to
@@ -520,7 +520,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepare</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3510">checkAndPrepare</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3516">checkAndPrepare</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPrepare--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Validates each mutation and prepares a batch for write. If necessary (non-replay case), runs
@@ -542,7 +542,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3555">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3561">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                        long&nbsp;timestamp,
                                        <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/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                 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>
@@ -563,7 +563,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>buildWALEdits</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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3591">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt
 ;&nbsp;miniBatchOp)
+<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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3597">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt
 ;&nbsp;miniBatchOp)
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#buildWALEdits-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Builds separate WALEdit per nonce by applying input mutations. If WALEdits from CP are
@@ -582,7 +582,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3602">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3608">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                                                     @Nullable
                                                                                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                                                              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>
@@ -602,7 +602,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>completeMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3613">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3619">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#completeMiniBatchOperations-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.WriteEntry-">HRegion.BatchOperation</a></code></span></div>
@@ -622,7 +622,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>doPostOpCleanupForMiniBatch</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3625">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3631">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit,
                                         boolean&nbsp;success)
                                  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>
@@ -640,7 +640,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>callPreMutateCPHook</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3674">callPreMutateCPHook</a>(int&nbsp;index,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3680">callPreMutateCPHook</a>(int&nbsp;index,
                                  <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit,
                                  int[]&nbsp;metrics)
                           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>
@@ -659,7 +659,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndMergeCPMutations</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3711">checkAndMergeCPMutations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3717">checkAndMergeCPMutations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                       <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/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks,
                                       long&nbsp;timestamp)
                                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>
@@ -675,7 +675,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>mergeFamilyMaps</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3746">mergeFamilyMaps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3752">mergeFamilyMaps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;toBeMerged)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index 47ab720..4b8e3c2 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6215">HRegion.RegionScannerImpl</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6221">HRegion.RegionScannerImpl</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/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html" title="interface in org.apache.hadoop.hbase.regionserver">Shipper</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a></pre>
 <div class="block">RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).</div>
@@ -425,7 +425,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>storeHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6218">storeHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6224">storeHeap</a></pre>
 </li>
 </ul>
 <a name="joinedHeap">
@@ -434,7 +434,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6221">joinedHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6227">joinedHeap</a></pre>
 <div class="block">Heap of key-values that are not essential for the provided filters and are thus read
  on demand, if on-demand column family loading is enabled.</div>
 </li>
@@ -445,7 +445,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedContinuationRow</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6225">joinedContinuationRow</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6231">joinedContinuationRow</a></pre>
 <div class="block">If the joined heap data gathering is interrupted due to scan limits, this will
  contain the row for which we are populating the values.</div>
 </li>
@@ -456,7 +456,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterClosed</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6226">filterClosed</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6232">filterClosed</a></pre>
 </li>
 </ul>
 <a name="stopRow">
@@ -465,7 +465,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>stopRow</h4>
-<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6228">stopRow</a></pre>
+<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6234">stopRow</a></pre>
 </li>
 </ul>
 <a name="includeStopRow">
@@ -474,7 +474,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>includeStopRow</h4>
-<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6229">includeStopRow</a></pre>
+<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6235">includeStopRow</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -483,7 +483,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6230">region</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6236">region</a></pre>
 </li>
 </ul>
 <a name="comparator">
@@ -492,7 +492,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>comparator</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6231">comparator</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6237">comparator</a></pre>
 </li>
 </ul>
 <a name="readPt">
@@ -501,7 +501,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>readPt</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6233">readPt</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6239">readPt</a></pre>
 </li>
 </ul>
 <a name="maxResultSize">
@@ -510,7 +510,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>maxResultSize</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6234">maxResultSize</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6240">maxResultSize</a></pre>
 </li>
 </ul>
 <a name="defaultScannerContext">
@@ -519,7 +519,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>defaultScannerContext</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6235">defaultScannerContext</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6241">defaultScannerContext</a></pre>
 </li>
 </ul>
 <a name="filter">
@@ -528,7 +528,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>filter</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6236">filter</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6242">filter</a></pre>
 </li>
 </ul>
 </li>
@@ -545,7 +545,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>RegionScannerImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6243">RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6249">RegionScannerImpl</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/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;additionalScanners,
                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</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>
@@ -561,7 +561,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionScannerImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6248">RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6254">RegionScannerImpl</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/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;additionalScanners,
                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                   long&nbsp;nonceGroup,
@@ -587,7 +587,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <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/HRegion.RegionScannerImpl.html#line.6239">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/HRegion.RegionScannerImpl.html#line.6245">getRegionInfo</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getRegionInfo--">getRegionInfo</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -602,7 +602,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeScanners</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6286">initializeScanners</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;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6292">initializeScanners</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/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;additionalScanners)
                            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>
@@ -617,7 +617,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeKVHeap</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6318">initializeKVHeap</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;scanners,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6324">initializeKVHeap</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;scanners,
                                 <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;joinedScanners,
                                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</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>
@@ -633,7 +633,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>handleException</h4>
-<pre>private&nbsp;<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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6327">handleException</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;instantiatedScanners,
+<pre>private&nbsp;<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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6333">handleException</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;instantiatedScanners,
                                     <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>&nbsp;t)</pre>
 </li>
 </ul>
@@ -643,7 +643,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxResultSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6348">getMaxResultSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6354">getMaxResultSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMaxResultSize--">getMaxResultSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -659,7 +659,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMvccReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6353">getMvccReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6359">getMvccReadPoint</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMvccReadPoint--">getMvccReadPoint</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -674,7 +674,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getBatch</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6358">getBatch</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6364">getBatch</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getBatch--">getBatch</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -690,7 +690,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>resetFilters</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6367">resetFilters</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6373">resetFilters</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">Reset both the filter and the old filter.</div>
 <dl>
@@ -705,7 +705,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6374">next</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6380">next</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
              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/InternalScanner.html#next-java.util.List-">InternalScanner</a></code></span></div>
 <div class="block">Grab the next row's worth of values.</div>
@@ -727,7 +727,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6381">next</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6387">next</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
              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/InternalScanner.html#next-java.util.List-org.apache.hadoop.hbase.regionserver.ScannerContext-">InternalScanner</a></code></span></div>
@@ -750,7 +750,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6397">nextRaw</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6403">nextRaw</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
                 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/RegionScanner.html#nextRaw-java.util.List-">RegionScanner</a></code></span></div>
 <div class="block">Grab the next row's worth of values. This is a special internal method to be called from
@@ -775,7 +775,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6403">nextRaw</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6409">nextRaw</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                 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/RegionScanner.html#nextRaw-java.util.List-org.apache.hadoop.hbase.regionserver.ScannerContext-">RegionScanner</a></code></span></div>
@@ -821,7 +821,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateFromJoinedHeap</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6440">populateFromJoinedHeap</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6446">populateFromJoinedHeap</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                                 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>
@@ -838,7 +838,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateResult</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6464">populateResult</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6470">populateResult</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                                <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;heap,
                                <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
                                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
@@ -863,7 +863,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>moreCellsInRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6505">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6511">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
                                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 <div class="block">Based on the nextKv in the heap, and the current row, decide whether or not there are more
  cells to be read in the heap. If the row of the nextKv in the heap matches the current row
@@ -883,7 +883,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6513">isFilterDone</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6519">isFilterDone</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -901,7 +901,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDoneInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6517">isFilterDoneInternal</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6523">isFilterDoneInternal</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>
@@ -915,7 +915,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6521">nextInternal</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6527">nextInternal</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                       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>
@@ -930,7 +930,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsFilteredMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6744">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6750">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="incrementCountOfRowsScannedMetric-org.apache.hadoop.hbase.regionserver.ScannerContext-">
@@ -939,7 +939,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsScannedMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6752">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6758">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="joinedHeapMayHaveData-org.apache.hadoop.hbase.Cell-">
@@ -948,7 +948,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeapMayHaveData</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6763">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6769">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
                                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>
@@ -966,7 +966,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6790">filterRow</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6796">filterRow</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 function is to maintain backward compatibility for 0.94 filters. HBASE-6429 combines
  both filterRow & filterRow(<code>List&lt;KeyValue&gt; kvs</code>) functions. While 0.94 code or older,
@@ -985,7 +985,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6797">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6803">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
                       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>
@@ -999,7 +999,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRow</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6801">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6807">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
                           <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curRowCell)
                    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>
@@ -1014,7 +1014,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldStop</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6816">shouldStop</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6822">shouldStop</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 </li>
 </ul>
 <a name="close--">
@@ -1023,7 +1023,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6828">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6834">close</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#close--">InternalScanner</a></code></span></div>
 <div class="block">Closes the scanner and releases any resources it has allocated</div>
 <dl>
@@ -1042,7 +1042,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreHeapForTesting</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6842">getStoreHeapForTesting</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6848">getStoreHeapForTesting</a>()</pre>
 </li>
 </ul>
 <a name="reseek-byte:A-">
@@ -1051,7 +1051,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6847">reseek</a>(byte[]&nbsp;row)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6853">reseek</a>(byte[]&nbsp;row)
                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/RegionScanner.html#reseek-byte:A-">RegionScanner</a></code></span></div>
 <div class="block">Do a reseek to the required row. Should not be used to seek to a key which
@@ -1071,7 +1071,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>shipped</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6867">shipped</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6873">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
@@ -1090,7 +1090,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6877">run</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6883">run</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/ipc/RpcCallback.html#run--">RpcCallback</a></code></span></div>
 <div class="block">Called at the end of an Rpc Call <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc"><code>RpcCallContext</code></a></div>


[13/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>       

<TRUNCATED>

[07/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<a name="line.2558"></a>
-

<TRUNCATED>

[21/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 89cf72c..7ab6815 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -704,20 +704,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.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/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.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 e8df157..feee307 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,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/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 cd3870f..30c4e73 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/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>
+<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>
 </ul>
 </li>
 </ul>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html b/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
index 1126eb3..237fbee 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html
@@ -258,7 +258,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>thriftTwo</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceImpl.html" title="class in org.apache.hadoop.hbase.thrift">MetricsThriftServerSourceImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html#line.39">thriftTwo</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceImpl.html" title="class in org.apache.hadoop.hbase.thrift">MetricsThriftServerSourceImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html#line.36">thriftTwo</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html b/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
index 54d871c..6de6183 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html
@@ -247,7 +247,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftS
 <ul class="blockList">
 <li class="blockList">
 <h4>createThriftOneSource</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSource.html" title="interface in org.apache.hadoop.hbase.thrift">MetricsThriftServerSource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html#line.46">createThriftOneSource</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSource.html" title="interface in org.apache.hadoop.hbase.thrift">MetricsThriftServerSource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.html#line.40">createThriftOneSource</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactory.html#createThriftOneSource--">MetricsThriftServerSourceFactory</a></code></span></div>
 <div class="block">Create a Source for a thrift one server</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 b6414de..3eda6cc 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -533,14 +533,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/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.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/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/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/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/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/overview-tree.html b/devapidocs/overview-tree.html
index 8373e3e..2dcae3e 100644
--- a/devapidocs/overview-tree.html
+++ b/devapidocs/overview-tree.html
@@ -2349,6 +2349,7 @@
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredRPCHandlerImpl</span></a> (implements org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandler</a>)</li>
 </ul>
 </li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.StatusJournalEntryImpl.html" title="class in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTaskImpl.StatusJournalEntryImpl</span></a> (implements org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask.StatusJournalEntry</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/MultiAction.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">MultiAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/MultiHConnection.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">MultiHConnection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/MultiResponse.RegionResult.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">MultiResponse.RegionResult</span></a></li>
@@ -4944,6 +4945,7 @@
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactory.html" title="interface in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ModifyRegionUtils.RegionEditTask.html" title="interface in org.apache.hadoop.hbase.util"><span class="typeNameLink">ModifyRegionUtils.RegionEditTask</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ModifyRegionUtils.RegionFillTask.html" title="interface in org.apache.hadoop.hbase.util"><span class="typeNameLink">ModifyRegionUtils.RegionFillTask</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/MonitoredTask.StatusJournalEntry.html" title="interface in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.StatusJournalEntry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/NonceGenerator.html" title="interface in org.apache.hadoop.hbase.client"><span class="typeNameLink">NonceGenerator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.normalizer.<a href="org/apache/hadoop/hbase/master/normalizer/NormalizationPlan.html" title="interface in org.apache.hadoop.hbase.master.normalizer"><span class="typeNameLink">NormalizationPlan</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ObjectPool.ObjectFactory.html" title="interface in org.apache.hadoop.hbase.util"><span class="typeNameLink">ObjectPool.ObjectFactory</span></a>&lt;K,V&gt;</li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/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 0203118..fbe185e 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 = "361be533445e06ce477db9ac07a809e11f813ed4";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "59867eeeebd28fcc49f338ef36769fb6a9bff4dc";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Sat Jul  7 14:40:00 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Mon Jul  9 14:39:06 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 = "98ef0582528be50e91286419c53c8e29";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "0c4202f0f4e6233beea2dec060218d34";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html
index 9dc713d..9aa9b59 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.LocateRequest.html
@@ -342,205 +342,206 @@
 <span class="sourceLineNo">334</span><a name="line.334"></a>
 <span class="sourceLineNo">335</span>  private HRegionLocation locateRowBeforeInCache(TableCache tableCache, TableName tableName,<a name="line.335"></a>
 <span class="sourceLineNo">336</span>      byte[] row) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    Map.Entry&lt;byte[], HRegionLocation&gt; entry =<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      isEmptyStopRow(row) ? tableCache.cache.lastEntry() : tableCache.cache.lowerEntry(row);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    if (entry == null) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      return null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    HRegionLocation loc = entry.getValue();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (isEmptyStopRow(loc.getRegion().getEndKey()) ||<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      Bytes.compareTo(loc.getRegion().getEndKey(), row) &gt;= 0) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      if (LOG.isTraceEnabled()) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        LOG.trace("Found " + loc + " in cache for '" + tableName + "', row='" +<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          Bytes.toStringBinary(row) + "', locateType=" + RegionLocateType.BEFORE);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      return loc;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    } else {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      return null;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private void locateInMeta(TableName tableName, LocateRequest req) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    if (LOG.isTraceEnabled()) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.trace("Try locate '" + tableName + "', row='" + Bytes.toStringBinary(req.row) +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        "', locateType=" + req.locateType + " in meta");<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[] metaStartKey;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    if (req.locateType.equals(RegionLocateType.BEFORE)) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      if (isEmptyStopRow(req.row)) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        byte[] binaryTableName = tableName.getName();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        metaStartKey = Arrays.copyOf(binaryTableName, binaryTableName.length + 1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      } else {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        metaStartKey = createRegionName(tableName, req.row, ZEROES, false);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    } else {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      metaStartKey = createRegionName(tableName, req.row, NINES, false);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    byte[] metaStopKey =<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      RegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW, "", false);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    conn.getTable(META_TABLE_NAME)<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      .scan(new Scan().withStartRow(metaStartKey).withStopRow(metaStopKey, true)<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        .addFamily(HConstants.CATALOG_FAMILY).setReversed(true).setCaching(locatePrefetchLimit)<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        .setReadType(ReadType.PREAD), new AdvancedScanResultConsumer() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>          private boolean completeNormally = false;<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>          private boolean tableNotFound = true;<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>          @Override<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          public void onError(Throwable error) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>            complete(tableName, req, null, error);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>          @Override<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          public void onComplete() {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>            if (tableNotFound) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>              complete(tableName, req, null, new TableNotFoundException(tableName));<a name="line.390"></a>
-<span class="sourceLineNo">391</span>            } else if (!completeNormally) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>              complete(tableName, req, null, new IOException(<a name="line.392"></a>
-<span class="sourceLineNo">393</span>                "Unable to find region for " + Bytes.toStringBinary(req.row) + " in " + tableName));<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><a name="line.396"></a>
-<span class="sourceLineNo">397</span>          @Override<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          public void onNext(Result[] results, ScanController controller) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            if (results.length == 0) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>              return;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            tableNotFound = false;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>            int i = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>            for (; i &lt; results.length; i++) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>              if (onScanNext(tableName, req, results[i])) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                completeNormally = true;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                controller.terminate();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                i++;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                break;<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            // Add the remaining results into cache<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            if (i &lt; results.length) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>              TableCache tableCache = getTableCache(tableName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              for (; i &lt; results.length; i++) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                RegionLocations locs = MetaTableAccessor.getRegionLocations(results[i]);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                if (locs == null) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                  continue;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                HRegionLocation loc = locs.getDefaultRegionLocation();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                if (loc == null) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>                  continue;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                RegionInfo info = loc.getRegion();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                if (info == null || info.isOffline() || info.isSplitParent() ||<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                  loc.getServerName() == null) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                  continue;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                if (addToCache(tableCache, loc)) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                  synchronized (tableCache) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                    tableCache.clearCompletedRequests(Optional.of(loc));<a name="line.431"></a>
-<span class="sourceLineNo">432</span>                  }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>                }<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            }<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        });<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private HRegionLocation locateInCache(TableCache tableCache, TableName tableName, byte[] row,<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      RegionLocateType locateType) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return locateType.equals(RegionLocateType.BEFORE)<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      ? locateRowBeforeInCache(tableCache, tableName, row)<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      : locateRowInCache(tableCache, tableName, row);<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>  // locateToPrevious is true means we will use the start key of a region to locate the region<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  // placed before it. Used for reverse scan. See the comment of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  // AsyncRegionLocator.getPreviousRegionLocation.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  private CompletableFuture&lt;HRegionLocation&gt; getRegionLocationInternal(TableName tableName,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      byte[] row, RegionLocateType locateType, boolean reload) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // AFTER should be convert to CURRENT before calling this method<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    assert !locateType.equals(RegionLocateType.AFTER);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    TableCache tableCache = getTableCache(tableName);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    if (!reload) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      if (loc != null) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        return CompletableFuture.completedFuture(loc);<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>    CompletableFuture&lt;HRegionLocation&gt; future;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    LocateRequest req;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    boolean sendRequest = false;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    synchronized (tableCache) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // check again<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (!reload) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        if (loc != null) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          return CompletableFuture.completedFuture(loc);<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>      req = new LocateRequest(row, locateType);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      future = tableCache.allRequests.get(req);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      if (future == null) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        future = new CompletableFuture&lt;&gt;();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        tableCache.allRequests.put(req, future);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        if (tableCache.hasQuota(maxConcurrentLocateRequestPerTable) &amp;&amp; !tableCache.isPending(req)) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          tableCache.send(req);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          sendRequest = true;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    if (sendRequest) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      locateInMeta(tableName, req);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return future;<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>  CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, byte[] row,<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      RegionLocateType locateType, boolean reload) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    if (locateType.equals(RegionLocateType.BEFORE)) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      return getRegionLocationInternal(tableName, row, locateType, reload);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    } else {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // as we know the exact row after us, so we can just create the new row, and use the same<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      // algorithm to locate it.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (locateType.equals(RegionLocateType.AFTER)) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        row = createClosestRowAfter(row);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      return getRegionLocationInternal(tableName, row, RegionLocateType.CURRENT, reload);<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>  void updateCachedLocation(HRegionLocation loc, Throwable exception) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    AsyncRegionLocator.updateCachedLocation(loc, exception, l -&gt; {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      TableCache tableCache = cache.get(l.getRegion().getTable());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      if (tableCache == null) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        return null;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      }<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return tableCache.cache.get(l.getRegion().getStartKey());<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }, this::addToCache, this::removeFromCache);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  void clearCache(TableName tableName) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    TableCache tableCache = cache.remove(tableName);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if (tableCache == null) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      return;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    synchronized (tableCache) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      if (!tableCache.allRequests.isEmpty()) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        IOException error = new IOException("Cache cleared");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        tableCache.allRequests.values().forEach(f -&gt; f.completeExceptionally(error));<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>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // only used for testing whether we have cached the location for a region.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  @VisibleForTesting<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  HRegionLocation getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableCache tableCache = cache.get(tableName);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    if (tableCache == null) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return null;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    return locateRowInCache(tableCache, tableName, row);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>}<a name="line.535"></a>
+<span class="sourceLineNo">337</span>    boolean isEmptyStopRow = isEmptyStopRow(row);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    Map.Entry&lt;byte[], HRegionLocation&gt; entry =<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        isEmptyStopRow ? tableCache.cache.lastEntry() : tableCache.cache.lowerEntry(row);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (entry == null) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      return null;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    HRegionLocation loc = entry.getValue();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    if (isEmptyStopRow(loc.getRegion().getEndKey()) ||<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      (!isEmptyStopRow &amp;&amp; Bytes.compareTo(loc.getRegion().getEndKey(), row) &gt;= 0)) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (LOG.isTraceEnabled()) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("Found " + loc + " in cache for '" + tableName + "', row='" +<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          Bytes.toStringBinary(row) + "', locateType=" + RegionLocateType.BEFORE);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      return loc;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    } else {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      return null;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  private void locateInMeta(TableName tableName, LocateRequest req) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    if (LOG.isTraceEnabled()) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      LOG.trace("Try locate '" + tableName + "', row='" + Bytes.toStringBinary(req.row) +<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        "', locateType=" + req.locateType + " in meta");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    byte[] metaStartKey;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (req.locateType.equals(RegionLocateType.BEFORE)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      if (isEmptyStopRow(req.row)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        byte[] binaryTableName = tableName.getName();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        metaStartKey = Arrays.copyOf(binaryTableName, binaryTableName.length + 1);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      } else {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        metaStartKey = createRegionName(tableName, req.row, ZEROES, false);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    } else {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      metaStartKey = createRegionName(tableName, req.row, NINES, false);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    byte[] metaStopKey =<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      RegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW, "", false);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    conn.getTable(META_TABLE_NAME)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      .scan(new Scan().withStartRow(metaStartKey).withStopRow(metaStopKey, true)<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        .addFamily(HConstants.CATALOG_FAMILY).setReversed(true).setCaching(locatePrefetchLimit)<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        .setReadType(ReadType.PREAD), new AdvancedScanResultConsumer() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>          private boolean completeNormally = false;<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>          private boolean tableNotFound = true;<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>          public void onError(Throwable error) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>            complete(tableName, req, null, error);<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>          @Override<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          public void onComplete() {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            if (tableNotFound) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>              complete(tableName, req, null, new TableNotFoundException(tableName));<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            } else if (!completeNormally) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>              complete(tableName, req, null, new IOException(<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                "Unable to find region for " + Bytes.toStringBinary(req.row) + " in " + tableName));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>            }<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>          @Override<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          public void onNext(Result[] results, ScanController controller) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            if (results.length == 0) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>              return;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            tableNotFound = false;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            int i = 0;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            for (; i &lt; results.length; i++) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>              if (onScanNext(tableName, req, results[i])) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>                completeNormally = true;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>                controller.terminate();<a name="line.408"></a>
+<span class="sourceLineNo">409</span>                i++;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>                break;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>              }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            // Add the remaining results into cache<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            if (i &lt; results.length) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>              TableCache tableCache = getTableCache(tableName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>              for (; i &lt; results.length; i++) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>                RegionLocations locs = MetaTableAccessor.getRegionLocations(results[i]);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                if (locs == null) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                  continue;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>                }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>                HRegionLocation loc = locs.getDefaultRegionLocation();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>                if (loc == null) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>                  continue;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>                }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>                RegionInfo info = loc.getRegion();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                if (info == null || info.isOffline() || info.isSplitParent() ||<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                  loc.getServerName() == null) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>                  continue;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>                }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>                if (addToCache(tableCache, loc)) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  synchronized (tableCache) {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                    tableCache.clearCompletedRequests(Optional.of(loc));<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>                }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>              }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        });<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>  private HRegionLocation locateInCache(TableCache tableCache, TableName tableName, byte[] row,<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      RegionLocateType locateType) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return locateType.equals(RegionLocateType.BEFORE)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      ? locateRowBeforeInCache(tableCache, tableName, row)<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      : locateRowInCache(tableCache, tableName, row);<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>  // locateToPrevious is true means we will use the start key of a region to locate the region<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  // placed before it. Used for reverse scan. See the comment of<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  // AsyncRegionLocator.getPreviousRegionLocation.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  private CompletableFuture&lt;HRegionLocation&gt; getRegionLocationInternal(TableName tableName,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      byte[] row, RegionLocateType locateType, boolean reload) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    // AFTER should be convert to CURRENT before calling this method<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    assert !locateType.equals(RegionLocateType.AFTER);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    TableCache tableCache = getTableCache(tableName);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    if (!reload) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      if (loc != null) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>        return CompletableFuture.completedFuture(loc);<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>    CompletableFuture&lt;HRegionLocation&gt; future;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    LocateRequest req;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    boolean sendRequest = false;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    synchronized (tableCache) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      // check again<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      if (!reload) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        HRegionLocation loc = locateInCache(tableCache, tableName, row, locateType);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        if (loc != null) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>          return CompletableFuture.completedFuture(loc);<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>      req = new LocateRequest(row, locateType);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      future = tableCache.allRequests.get(req);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      if (future == null) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        future = new CompletableFuture&lt;&gt;();<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        tableCache.allRequests.put(req, future);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        if (tableCache.hasQuota(maxConcurrentLocateRequestPerTable) &amp;&amp; !tableCache.isPending(req)) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>          tableCache.send(req);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          sendRequest = true;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    if (sendRequest) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      locateInMeta(tableName, req);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    return future;<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>  CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, byte[] row,<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      RegionLocateType locateType, boolean reload) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    if (locateType.equals(RegionLocateType.BEFORE)) {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      return getRegionLocationInternal(tableName, row, locateType, reload);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    } else {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      // as we know the exact row after us, so we can just create the new row, and use the same<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      // algorithm to locate it.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      if (locateType.equals(RegionLocateType.AFTER)) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        row = createClosestRowAfter(row);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      return getRegionLocationInternal(tableName, row, RegionLocateType.CURRENT, reload);<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><a name="line.503"></a>
+<span class="sourceLineNo">504</span>  void updateCachedLocation(HRegionLocation loc, Throwable exception) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    AsyncRegionLocator.updateCachedLocation(loc, exception, l -&gt; {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      TableCache tableCache = cache.get(l.getRegion().getTable());<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      if (tableCache == null) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        return null;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      return tableCache.cache.get(l.getRegion().getStartKey());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    }, this::addToCache, this::removeFromCache);<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>  void clearCache(TableName tableName) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    TableCache tableCache = cache.remove(tableName);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    if (tableCache == null) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      return;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    synchronized (tableCache) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      if (!tableCache.allRequests.isEmpty()) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        IOException error = new IOException("Cache cleared");<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        tableCache.allRequests.values().forEach(f -&gt; f.completeExceptionally(error));<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      }<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><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  // only used for testing whether we have cached the location for a region.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  @VisibleForTesting<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  HRegionLocation getRegionLocationInCache(TableName tableName, byte[] row) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    TableCache tableCache = cache.get(tableName);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (tableCache == null) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      return null;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return locateRowInCache(tableCache, tableName, row);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>}<a name="line.536"></a>
 
 
 


[23/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
index 6ac285d..b62cd5a 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3763">HRegion.ReplayBatchOperation</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3769">HRegion.ReplayBatchOperation</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</pre>
 <div class="block">Batch of mutations for replay. Base class is shared with <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver"><code>HRegion.MutationBatchOperation</code></a> as most
  of the logic is same.</div>
@@ -306,7 +306,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>origLogSeqNum</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3764">origLogSeqNum</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3770">origLogSeqNum</a></pre>
 </li>
 </ul>
 </li>
@@ -323,7 +323,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReplayBatchOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3765">ReplayBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3771">ReplayBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                             <a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>[]&nbsp;operations,
                             long&nbsp;origLogSeqNum)</pre>
 </li>
@@ -342,7 +342,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutation</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3772">getMutation</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3778">getMutation</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutation-int-">getMutation</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -355,7 +355,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonceGroup</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3777">getNonceGroup</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3783">getNonceGroup</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonceGroup-int-">getNonceGroup</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -368,7 +368,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3782">getNonce</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3788">getNonce</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonce-int-">getNonce</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -381,7 +381,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutationsForCoprocs</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3787">getMutationsForCoprocs</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3793">getMutationsForCoprocs</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutationsForCoprocs--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">This method is potentially expensive and useful mostly for non-replay CP path.</div>
 <dl>
@@ -396,7 +396,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>isInReplay</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3792">isInReplay</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3798">isInReplay</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#isInReplay--">isInReplay</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -409,7 +409,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3797">getOrigLogSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3803">getOrigLogSeqNum</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getOrigLogSeqNum--">getOrigLogSeqNum</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -422,7 +422,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3802">startRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3808">startRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -438,7 +438,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3807">closeRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3813">closeRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -454,7 +454,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPreparePut</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3816">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3822">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                            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">During replay, there could exist column families which are removed between region server
  failure and replay</div>
@@ -472,7 +472,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepare</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3837">checkAndPrepare</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3843">checkAndPrepare</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPrepare--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Validates each mutation and prepares a batch for write. If necessary (non-replay case), runs
@@ -494,7 +494,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3846">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3852">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                        long&nbsp;timestamp,
                                        <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/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                 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>
@@ -515,7 +515,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3858">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3864">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                                                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#writeMiniBatchOperationsToMemStore-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.WriteEntry-">HRegion.BatchOperation</a></code></span></div>
@@ -534,7 +534,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>completeMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3866">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3872">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#completeMiniBatchOperations-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.WriteEntry-">HRegion.BatchOperation</a></code></span></div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index d6ef4ef..080810d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5823">HRegion.RowLockContext</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5829">HRegion.RowLockContext</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>
@@ -241,7 +241,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>row</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5824">row</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5830">row</a></pre>
 </li>
 </ul>
 <a name="readWriteLock">
@@ -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>readWriteLock</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5825">readWriteLock</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5831">readWriteLock</a></pre>
 </li>
 </ul>
 <a name="usable">
@@ -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>usable</h4>
-<pre>final&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/HRegion.RowLockContext.html#line.5826">usable</a></pre>
+<pre>final&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/HRegion.RowLockContext.html#line.5832">usable</a></pre>
 </li>
 </ul>
 <a name="count">
@@ -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>count</h4>
-<pre>final&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/regionserver/HRegion.RowLockContext.html#line.5827">count</a></pre>
+<pre>final&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/regionserver/HRegion.RowLockContext.html#line.5833">count</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -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>lock</h4>
-<pre>final&nbsp;<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> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5828">lock</a></pre>
+<pre>final&nbsp;<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> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5834">lock</a></pre>
 </li>
 </ul>
 <a name="threadName">
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>threadName</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/regionserver/HRegion.RowLockContext.html#line.5829">threadName</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/regionserver/HRegion.RowLockContext.html#line.5835">threadName</a></pre>
 </li>
 </ul>
 </li>
@@ -303,7 +303,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RowLockContext</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5831">RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5837">RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
 </li>
 </ul>
 </li>
@@ -320,7 +320,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>newWriteLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5835">newWriteLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5841">newWriteLock</a>()</pre>
 </li>
 </ul>
 <a name="newReadLock--">
@@ -329,7 +329,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>newReadLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5839">newReadLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5845">newReadLock</a>()</pre>
 </li>
 </ul>
 <a name="getRowLock-java.util.concurrent.locks.Lock-">
@@ -338,7 +338,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowLock</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5844">getRowLock</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5850">getRowLock</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
 </li>
 </ul>
 <a name="cleanUp--">
@@ -347,7 +347,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>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5855">cleanUp</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5861">cleanUp</a>()</pre>
 </li>
 </ul>
 <a name="setThreadName-java.lang.String-">
@@ -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>setThreadName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5868">setThreadName</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;threadName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5874">setThreadName</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;threadName)</pre>
 </li>
 </ul>
 <a name="toString--">
@@ -365,7 +365,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <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/HRegion.RowLockContext.html#line.5873">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/HRegion.RowLockContext.html#line.5879">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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index e42049f..e0f651a 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5886">HRegion.RowLockImpl</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5892">HRegion.RowLockImpl</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/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a></pre>
 <div class="block">Class used to represent a lock on a row.</div>
@@ -226,7 +226,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>context</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5887">context</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5893">context</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -235,7 +235,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5888">lock</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5894">lock</a></pre>
 </li>
 </ul>
 </li>
@@ -252,7 +252,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RowLockImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5890">RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5896">RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock)</pre>
 </li>
 </ul>
@@ -270,7 +270,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getLock</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5895">getLock</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5901">getLock</a>()</pre>
 </li>
 </ul>
 <a name="getContext--">
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getContext</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5900">getContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5906">getContext</a>()</pre>
 </li>
 </ul>
 <a name="release--">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>release</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5905">release</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5911">release</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html#release--">Region.RowLock</a></code></span></div>
 <div class="block">Release the given lock.  If there are no remaining locks held by the current thread
  then unlock the row and allow other threads to acquire the lock.</div>
@@ -304,7 +304,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <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/HRegion.RowLockImpl.html#line.5911">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/HRegion.RowLockImpl.html#line.5917">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>


[10/30] hbase-site git commit: Published site at 59867eeeebd28fcc49f338ef36769fb6a9bff4dc.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/67e3bccd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
index 6cd6a17..85dd23b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
@@ -2119,6526 +2119,6532 @@
 <span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
 <span class="sourceLineNo">2112</span><a name="line.2112"></a>
 <span class="sourceLineNo">2113</span>      status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (this.closed.get()) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        LOG.debug(msg);<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>        status.abort(msg);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>        return false;<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      boolean wasStateSet = false;<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      try {<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        synchronized (writestate) {<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>          if (writestate.writesEnabled) {<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>            wasStateSet = true;<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>            writestate.compacting.incrementAndGet();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>          } else {<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>            LOG.info(msg);<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            status.abort(msg);<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>            return false;<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>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>        doRegionCompactionPrep();<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        try {<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>          status.setStatus("Compacting store " + store);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>          // We no longer need to cancel the request on the way out of this<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>          // method because Store#compact will clean up unconditionally<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>          requestNeedsCancellation = false;<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>          store.compact(compaction, throughputController, user);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>        } catch (InterruptedIOException iioe) {<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>          String msg = "compaction interrupted";<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>          LOG.info(msg, iioe);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>          status.abort(msg);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span>          return false;<a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>      } finally {<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>        if (wasStateSet) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>          synchronized (writestate) {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>            writestate.compacting.decrementAndGet();<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>              writestate.notifyAll();<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>        }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>      }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>      status.markComplete("Compaction complete");<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>      return true;<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>    } finally {<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>      if (status != null) status.cleanup();<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>  }<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>   * Flush the cache.<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>   *<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>   * &lt;ol&gt;<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>   * &lt;/ol&gt;<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>   *<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>   * time-sensitive thread.<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>   * @param force whether we want to force a flush of all stores<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>   * the region needs compacting<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>   *<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>   * @throws IOException general io exceptions<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>   * because a snapshot was not properly persisted.<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>   */<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>  }<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>  public interface FlushResult {<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    enum Result {<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>      CANNOT_FLUSH<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>    }<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span><a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    /** @return the detailed result code */<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    Result getResult();<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    /** @return true if the memstores were flushed, else false */<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    boolean isFlushSucceeded();<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span><a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    boolean isCompactionNeeded();<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2114</span>      status.enableStatusJournal(false);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      if (this.closed.get()) {<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>        String msg = "Skipping compaction on " + this + " because closed";<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        LOG.debug(msg);<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        status.abort(msg);<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>        return false;<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>      }<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      boolean wasStateSet = false;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      try {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        synchronized (writestate) {<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>          if (writestate.writesEnabled) {<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>            wasStateSet = true;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>            writestate.compacting.incrementAndGet();<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>          } else {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>            String msg = "NOT compacting region " + this + ". Writes disabled.";<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>            LOG.info(msg);<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>            status.abort(msg);<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            return false;<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          }<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        }<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        LOG.info("Starting compaction of {} in {}{}", store, this,<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>            (compaction.getRequest().isOffPeak()?" as an off-peak compaction":""));<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        doRegionCompactionPrep();<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>        try {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>          status.setStatus("Compacting store " + store);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>          // We no longer need to cancel the request on the way out of this<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>          // method because Store#compact will clean up unconditionally<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>          requestNeedsCancellation = false;<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>          store.compact(compaction, throughputController, user);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>        } catch (InterruptedIOException iioe) {<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>          String msg = "compaction interrupted";<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>          LOG.info(msg, iioe);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>          status.abort(msg);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>          return false;<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>        }<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>      } finally {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>        if (wasStateSet) {<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>          synchronized (writestate) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>            writestate.compacting.decrementAndGet();<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>            if (writestate.compacting.get() &lt;= 0) {<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>              writestate.notifyAll();<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>            }<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>          }<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>        }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      }<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>      status.markComplete("Compaction complete");<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>      return true;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>    } finally {<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>      if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>      if (status != null) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>        LOG.debug("Compaction status journal:\n\t" + status.prettyPrintJournal());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>        status.cleanup();<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>      }<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>    }<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  }<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span><a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>  /**<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>   * Flush the cache.<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>   *<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>   * &lt;p&gt;When this method is called the cache will be flushed unless:<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>   * &lt;ol&gt;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>   * &lt;/ol&gt;<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>   *<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>   * time-sensitive thread.<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>   * @param force whether we want to force a flush of all stores<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>   * @return FlushResult indicating whether the flush was successful or not and if<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>   * the region needs compacting<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>   *<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>   * @throws IOException general io exceptions<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>   * because a snapshot was not properly persisted.<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>   */<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>  // TODO HBASE-18905. We might have to expose a requestFlush API for CPs<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>  public FlushResult flush(boolean force) throws IOException {<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    return flushcache(force, false, FlushLifeCycleTracker.DUMMY);<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>  }<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span><a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>  public interface FlushResult {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>    enum Result {<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>      FLUSHED_NO_COMPACTION_NEEDED,<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      FLUSHED_COMPACTION_NEEDED,<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>      // Special case where a flush didn't run because there's nothing in the memstores. Used when<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>      // bulk loading to know when we can still load even if a flush didn't happen.<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      CANNOT_FLUSH_MEMSTORE_EMPTY,<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>      CANNOT_FLUSH<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    }<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    /** @return the detailed result code */<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    Result getResult();<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span><a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    /** @return true if the memstores were flushed, else false */<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    boolean isFlushSucceeded();<a name="line.2209"></a>
 <span class="sourceLineNo">2210</span><a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>  /**<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>   * Flush the cache.<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>   *<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>   * When this method is called the cache will be flushed unless:<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>   * &lt;ol&gt;<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>   * &lt;/ol&gt;<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span>   *<a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>   * time-sensitive thread.<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>   * @param tracker used to track the life cycle of this flush<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>   *<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>   * @throws IOException general io exceptions<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>   * caller MUST abort after this.<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>   */<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // fail-fast instead of waiting on the lock<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    if (this.closing.get()) {<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span>      LOG.debug(msg);<a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    }<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    status.setStatus("Acquiring readlock on region");<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span>    // block waiting for the lock for flushing cache<a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    lock.readLock().lock();<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    try {<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>      if (this.closed.get()) {<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>        LOG.debug(msg);<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>        status.abort(msg);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>      }<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>      if (coprocessorHost != null) {<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>        coprocessorHost.preFlush(tracker);<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>      }<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>      // successful<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>        numMutationsWithoutWAL.reset();<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>        dataInMemoryWithoutWAL.reset();<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>      }<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>      synchronized (writestate) {<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>          this.writestate.flushing = true;<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>        } else {<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span>          if (LOG.isDebugEnabled()) {<a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>                + writestate.writesEnabled);<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>          }<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span>          String msg = "Not flushing since "<a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>              + (writestate.flushing ? "already flushing"<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>              : "writes not enabled");<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>          status.abort(msg);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>        }<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>      }<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span><a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>      try {<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>        FlushResultImpl fs =<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span><a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>        if (coprocessorHost != null) {<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span>          coprocessorHost.postFlush(tracker);<a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>        }<a name="line.2289"></a>
+<span class="sourceLineNo">2211</span>    /** @return True if the flush requested a compaction, else false */<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    boolean isCompactionNeeded();<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>  }<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span><a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>  /**<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>   * Flush the cache.<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>   *<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>   * When this method is called the cache will be flushed unless:<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>   * &lt;ol&gt;<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>   *   &lt;li&gt;the cache is empty&lt;/li&gt;<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>   *   &lt;li&gt;the region is closed.&lt;/li&gt;<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span>   *   &lt;li&gt;a flush is already in progress&lt;/li&gt;<a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>   *   &lt;li&gt;writes are disabled&lt;/li&gt;<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>   * &lt;/ol&gt;<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>   *<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>   * &lt;p&gt;This method may block for some time, so it should not be called from a<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>   * time-sensitive thread.<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>   * @param forceFlushAllStores whether we want to flush all stores<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>   * @param writeFlushRequestWalMarker whether to write the flush request marker to WAL<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>   * @param tracker used to track the life cycle of this flush<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span>   * @return whether the flush is success and whether the region needs compacting<a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>   *<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>   * @throws IOException general io exceptions<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>   * @throws DroppedSnapshotException Thrown when replay of wal is required<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>   * because a Snapshot was not properly persisted. The region is put in closing mode, and the<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span>   * caller MUST abort after this.<a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>   */<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>  public FlushResultImpl flushcache(boolean forceFlushAllStores, boolean writeFlushRequestWalMarker,<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span>    // fail-fast instead of waiting on the lock<a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    if (this.closing.get()) {<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>      String msg = "Skipping flush on " + this + " because closing";<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>      LOG.debug(msg);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>      return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span>    }<a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    MonitoredTask status = TaskMonitor.get().createStatus("Flushing " + this);<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    status.enableStatusJournal(false);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    status.setStatus("Acquiring readlock on region");<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span>    // block waiting for the lock for flushing cache<a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    lock.readLock().lock();<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    try {<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>      if (this.closed.get()) {<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>        String msg = "Skipping flush on " + this + " because closed";<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>        LOG.debug(msg);<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span>        status.abort(msg);<a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>        return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>      }<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>      if (coprocessorHost != null) {<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>        status.setStatus("Running coprocessor pre-flush hooks");<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>        coprocessorHost.preFlush(tracker);<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>      // TODO: this should be managed within memstore with the snapshot, updated only after flush<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>      // successful<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>      if (numMutationsWithoutWAL.sum() &gt; 0) {<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>        numMutationsWithoutWAL.reset();<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>        dataInMemoryWithoutWAL.reset();<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>      }<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span>      synchronized (writestate) {<a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>        if (!writestate.flushing &amp;&amp; writestate.writesEnabled) {<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>          this.writestate.flushing = true;<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>        } else {<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>          if (LOG.isDebugEnabled()) {<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span>            LOG.debug("NOT flushing memstore for region " + this<a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>                + ", flushing=" + writestate.flushing + ", writesEnabled="<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>                + writestate.writesEnabled);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>          }<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>          String msg = "Not flushing since "<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>              + (writestate.flushing ? "already flushing"<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>              : "writes not enabled");<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>          status.abort(msg);<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>          return new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span>        }<a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>      }<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span><a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>      try {<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>        Collection&lt;HStore&gt; specificStoresToFlush =<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>            forceFlushAllStores ? stores.values() : flushPolicy.selectStoresToFlush();<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>        FlushResultImpl fs =<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span>            internalFlushcache(specificStoresToFlush, status, writeFlushRequestWalMarker, tracker);<a name="line.2289"></a>
 <span class="sourceLineNo">2290</span><a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>        if(fs.isFlushSucceeded()) {<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>          flushesQueued.reset();<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>        }<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span><a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>        status.markComplete("Flush successful");<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        return fs;<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>      } finally {<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span>        synchronized (writestate) {<a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>          writestate.flushing = false;<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>          this.writestate.flushRequested = false;<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>          writestate.notifyAll();<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>        }<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>      }<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>    } finally {<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>      lock.readLock().unlock();<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>      status.cleanup();<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    }<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span>  }<a name="line.2308"></a>
-<span class="sourceLineNo">2309</span><a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>  /**<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>   * Should the store be flushed because it is old enough.<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>   * &lt;p&gt;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>   * returns true which will make a lot of flush requests.<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>   */<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>  boolean shouldFlushStore(HStore store) {<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      if (LOG.isDebugEnabled()) {<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>      }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span>      return true;<a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>      return false;<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    }<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>      if (LOG.isDebugEnabled()) {<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>      }<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>      return true;<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span>    }<a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    return false;<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
-<span class="sourceLineNo">2342</span><a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>   * Should the memstore be flushed now<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>   */<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    whyFlush.setLength(0);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    // This is a rough measure.<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>      return true;<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span>    }<a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>      return false;<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    }<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>      return false;<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    //are met. Return true on first such memstore hit.<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    for (HStore s : stores.values()) {<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>        // we have an old enough edit in the memstore, flush<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>        return true;<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>      }<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span>    }<a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    return false;<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>  }<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span><a name="line.2378"></a>
-<span class="sourceLineNo">2379</span>  /**<a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>   * Flushing all stores.<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>   */<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>  }<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span><a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>  /**<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span>   * Flushing given stores.<a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>   */<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span>      writeFlushWalMarker, tracker);<a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>  }<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span><a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>  /**<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>   * flush operation.<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>   * &lt;p&gt;<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>   * of this flush, etc.<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>   * @param storesToFlush The list of stores to flush.<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>   * @return object describing the flush's state<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>   * @throws IOException general io exceptions<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>   */<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    PrepareFlushResult result =<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    if (result.result == null) {<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    } else {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>    }<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>  }<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span><a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      justification="FindBugs seems confused about trxId")<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>      // Don't flush when server aborting, it's unsafe<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>    }<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    // to go get one.<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span>      this.updatesLock.writeLock().lock();<a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>      WriteEntry writeEntry = null;<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>      try {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>          // (useful as marker when bulk loading, etc.).<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>          if (wal != null) {<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>            writeEntry = mvcc.begin();<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>            FlushResultImpl flushResult =<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>            mvcc.completeAndWait(writeEntry);<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2460"></a>
-<span class="sourceLineNo">2461</span>            writeEntry = null;<a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>          } else {<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span>          }<a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>      } finally {<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>        if (writeEntry != null) {<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>          mvcc.complete(writeEntry);<a name="line.2472"></a>
+<span class="sourceLineNo">2291</span>        if (coprocessorHost != null) {<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>          status.setStatus("Running post-flush coprocessor hooks");<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>          coprocessorHost.postFlush(tracker);<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>        }<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span><a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>        if(fs.isFlushSucceeded()) {<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>          flushesQueued.reset();<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>        }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>        status.markComplete("Flush successful");<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>        return fs;<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>      } finally {<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>        synchronized (writestate) {<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>          writestate.flushing = false;<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>          this.writestate.flushRequested = false;<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>          writestate.notifyAll();<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>        }<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>      }<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span>    } finally {<a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>      lock.readLock().unlock();<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>      LOG.debug("Flush status journal:\n\t" + status.prettyPrintJournal());<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>      status.cleanup();<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    }<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span><a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>   * Should the store be flushed because it is old enough.<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>   * &lt;p&gt;<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>   * Every FlushPolicy should call this to determine whether a store is old enough to flush (except<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>   * that you always flush all stores). Otherwise the method will always<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>   * returns true which will make a lot of flush requests.<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>   */<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>  boolean shouldFlushStore(HStore store) {<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    long earliest = this.wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>      store.getColumnFamilyDescriptor().getName()) - 1;<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>    if (earliest &gt; 0 &amp;&amp; earliest + flushPerChanges &lt; mvcc.getReadPoint()) {<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span>      if (LOG.isDebugEnabled()) {<a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>        LOG.debug("Flush column family " + store.getColumnFamilyName() + " of " +<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>          getRegionInfo().getEncodedName() + " because unflushed sequenceid=" + earliest +<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>          " is &gt; " + this.flushPerChanges + " from current=" + mvcc.getReadPoint());<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>      }<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>      return true;<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    }<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    if (this.flushCheckInterval &lt;= 0) {<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span>      return false;<a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    if (store.timeOfOldestEdit() &lt; now - this.flushCheckInterval) {<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>      if (LOG.isDebugEnabled()) {<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span>        LOG.debug("Flush column family: " + store.getColumnFamilyName() + " of " +<a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>          getRegionInfo().getEncodedName() + " because time of oldest edit=" +<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span>            store.timeOfOldestEdit() + " is &gt; " + this.flushCheckInterval + " from now =" + now);<a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>      }<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>      return true;<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    }<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    return false;<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span>  }<a name="line.2347"></a>
+<span class="sourceLineNo">2348</span><a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>  /**<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>   * Should the memstore be flushed now<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>   */<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span>  boolean shouldFlush(final StringBuilder whyFlush) {<a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    whyFlush.setLength(0);<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    // This is a rough measure.<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    if (this.maxFlushedSeqId &gt; 0<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>          &amp;&amp; (this.maxFlushedSeqId + this.flushPerChanges &lt; this.mvcc.getReadPoint())) {<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>      whyFlush.append("more than max edits, " + this.flushPerChanges + ", since last flush");<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>      return true;<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span>    }<a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    long modifiedFlushCheckInterval = flushCheckInterval;<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    if (getRegionInfo().getTable().isSystemTable() &amp;&amp;<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>        getRegionInfo().getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>      modifiedFlushCheckInterval = SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span>    }<a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>    if (modifiedFlushCheckInterval &lt;= 0) { //disabled<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>      return false;<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    }<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    //if we flushed in the recent past, we don't need to do again now<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    if ((now - getEarliestFlushTimeForAllStores() &lt; modifiedFlushCheckInterval)) {<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>      return false;<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    //since we didn't flush in the recent past, flush now if certain conditions<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    //are met. Return true on first such memstore hit.<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>    for (HStore s : stores.values()) {<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span>      if (s.timeOfOldestEdit() &lt; now - modifiedFlushCheckInterval) {<a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>        // we have an old enough edit in the memstore, flush<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>        whyFlush.append(s.toString() + " has an old edit so flush to free WALs");<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>        return true;<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span>      }<a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    }<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>    return false;<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>  }<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>  /**<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>   * Flushing all stores.<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>   * @see #internalFlushcache(Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>   */<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span>  private FlushResult internalFlushcache(MonitoredTask status) throws IOException {<a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    return internalFlushcache(stores.values(), status, false, FlushLifeCycleTracker.DUMMY);<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>  }<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span><a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>  /**<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>   * Flushing given stores.<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span>   * @see #internalFlushcache(WAL, long, Collection, MonitoredTask, boolean, FlushLifeCycleTracker)<a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>   */<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>  private FlushResultImpl internalFlushcache(Collection&lt;HStore&gt; storesToFlush, MonitoredTask status,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>      boolean writeFlushWalMarker, FlushLifeCycleTracker tracker) throws IOException {<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>    return internalFlushcache(this.wal, HConstants.NO_SEQNUM, storesToFlush, status,<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>      writeFlushWalMarker, tracker);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span>  }<a name="line.2401"></a>
+<span class="sourceLineNo">2402</span><a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>  /**<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>   * Flush the memstore. Flushing the memstore is a little tricky. We have a lot of updates in the<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>   * memstore, all of which have also been written to the wal. We need to write those updates in the<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>   * memstore out to disk, while being able to process reads/writes as much as possible during the<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span>   * flush operation.<a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>   * &lt;p&gt;<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>   * This method may block for some time. Every time you call it, we up the regions sequence id even<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>   * if we don't flush; i.e. the returned region id will be at least one larger than the last edit<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>   * applied to this region. The returned id does not refer to an actual edit. The returned id can<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>   * be used for say installing a bulk loaded file just ahead of the last hfile that was the result<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>   * of this flush, etc.<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span>   * @param wal Null if we're NOT to go via wal.<a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>   * @param myseqid The seqid to use if &lt;code&gt;wal&lt;/code&gt; is null writing out flush file.<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>   * @param storesToFlush The list of stores to flush.<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>   * @return object describing the flush's state<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>   * @throws IOException general io exceptions<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>   * @throws DroppedSnapshotException Thrown when replay of WAL is required.<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>   */<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>  protected FlushResultImpl internalFlushcache(WAL wal, long myseqid,<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>    PrepareFlushResult result =<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>        internalPrepareFlushCache(wal, myseqid, storesToFlush, status, writeFlushWalMarker, tracker);<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>    if (result.result == null) {<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>      return internalFlushCacheAndCommit(wal, status, result, storesToFlush);<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>    } else {<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      return result.result; // early exit due to failure from prepare stage<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>  }<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span><a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DLS_DEAD_LOCAL_STORE",<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>      justification="FindBugs seems confused about trxId")<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>  protected PrepareFlushResult internalPrepareFlushCache(WAL wal, long myseqid,<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>      Collection&lt;HStore&gt; storesToFlush, MonitoredTask status, boolean writeFlushWalMarker,<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>    if (this.rsServices != null &amp;&amp; this.rsServices.isAborted()) {<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>      // Don't flush when server aborting, it's unsafe<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span>      throw new IOException("Aborting flush because server is aborted...");<a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    }<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    final long startTime = EnvironmentEdgeManager.currentTime();<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    // If nothing to flush, return, but return with a valid unused sequenceId.<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    // Its needed by bulk upload IIRC. It flushes until no edits in memory so it can insert a<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>    // bulk loaded file between memory and existing hfiles. It wants a good seqeunceId that belongs<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>    // to no other that it can use to associate with the bulk load. Hence this little dance below<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span>    // to go get one.<a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>    if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>      // Take an update lock so no edits can come into memory just yet.<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>      this.updatesLock.writeLock().lock();<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>      WriteEntry writeEntry = null;<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>      try {<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>        if (this.memStoreSizing.getDataSize() &lt;= 0) {<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span>          // Presume that if there are still no edits in the memstore, then there are no edits for<a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>          // this region out in the WAL subsystem so no need to do any trickery clearing out<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>          // edits in the WAL sub-system. Up the sequence number so the resulting flush id is for<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>          // sure just beyond the last appended region edit and not associated with any edit<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>          // (useful as marker when bulk loading, etc.).<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>          if (wal != null) {<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>            writeEntry = mvcc.begin();<a name="line.2460"></a>
+<span class="sourceLineNo">2461</span>            long flushOpSeqId = writeEntry.getWriteNumber();<a name="line.2461"></a>
+<span class="sourceLineNo">2462</span>            FlushResultImpl flushResult =<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>                new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushOpSeqId,<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>                    "Nothing to flush", writeFlushRequestMarkerToWAL(wal, writeFlushWalMarker));<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>            mvcc.completeAndWait(writeEntry);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>            // Set to null so we don't complete it again down in finally block.<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>            writeEntry = null;<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span>            return new PrepareFlushResult(flushResult, myseqid);<a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>          } else {<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>            return new PrepareFlushResult(new FlushResultImpl(<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span>              FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, "Nothing to flush", false), myseqid);<a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>          }<a name="line.2472"></a>
 <span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span>        this.updatesLock.writeLock().unlock();<a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>      }<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    // during flush<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span><a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2483"></a>
-<span class="sourceLineNo">2484</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    // block waiting for the lock for internal flush<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    this.updatesLock.writeLock().lock();<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>    Map&lt;byte[], Long&gt; flushedFamilyNamesToSeq = new HashMap&lt;&gt;();<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>    for (HStore store : storesToFlush) {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>      flushedFamilyNamesToSeq.put(store.getColumnFamilyDescriptor().getName(),<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>        store.preFlushSeqIDEstimation());<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    }<a name="line.2495"></a>
+<span class="sourceLineNo">2474</span>      } finally {<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>        if (writeEntry != null) {<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span>          // If writeEntry is non-null, this operation failed; the mvcc transaction failed...<a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>          // but complete it anyways so it doesn't block the mvcc queue.<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>          mvcc.complete(writeEntry);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>        }<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span>        this.updatesLock.writeLock().unlock();<a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>      }<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    }<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    logFatLineOnFlush(storesToFlush, myseqid);<a name="line.2483"></a>
+<span class="sourceLineNo">2484</span>    // Stop updates while we snapshot the memstore of all of these regions' stores. We only have<a name="line.2484"></a>
+<span class="sourceLineNo">2485</span>    // to do this for a moment.  It is quick. We also set the memstore size to zero here before we<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    // allow updates again so its value will represent the size of the updates received<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    // during flush<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span><a name="line.2488"></a>
+<span class="sourceLineNo">2489</span>    // We have to take an update lock during snapshot, or else a write could end up in both snapshot<a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    // and memstore (makes it difficult to do atomic rows then)<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    status.setStatus("Obtaining lock to block concurrent updates");<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    // block waiting for the lock for internal flush<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    this.updatesLock.writeLock().lock();<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span>    status.setStatus("Preparing flush snapshotting stores in " + getRegionInfo().getEncodedName());<a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    MemStoreSizing totalSizeOfFlushableStores = new NonThreadSafeMemStoreSizing();<a name="line.2495"></a>
 <span class="sourceLineNo">2496</span><a name="line.2496"></a>
-<span class="sourceLineNo">2497</span>    TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // The sequence id of this flush operation which is used to log FlushMarker and pass to<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    // createFlushContext to use as the store file's sequence id. It can be in advance of edits<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    // still in the memstore, edits that are in other column families yet to be flushed.<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    long flushOpSeqId = HConstants.NO_SEQNUM;<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    // The max flushed sequence id after this flush operation completes. All edits in memstore<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span>    // will be in advance of this sequence id.<a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    long flushedSeqId = HConstants.NO_SEQNUM;<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    byte[] encodedRegionName = getRegionInfo().getEncodedNameAsBytes();<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    try {<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span>      if (wal != null) {<a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>        Long earliestUnflushedSequenceIdForTheRegion =<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>            wal.startCacheFlush(encodedRegionName, flushedFamilyNamesToSeq);<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>        if (earliestUnflushedSequenceIdForTheRegion == null) {<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>          // This should never happen. This is how startCacheFlush signals flush cannot proceed.<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>          String msg = this.getRegionInfo().getEncodedName() + " flush aborted; WAL closing.";<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>          status.setStatus(msg);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>          return new PrepareFlushResult(<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>              new FlushResultImpl(FlushResult.Result.CANNOT_FLUSH, msg, false),<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>              myseqid);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>        }<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>        flushOpSeqId = getNextSequenceId(wal);<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>        // Back up 1, minus 1 from oldest sequence id in memstore to get last 'flushed' edit<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span>        flushedSeqId =<a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>            earliestUnflushedSequenceIdForTheRegion.longValue() == HConstants.NO_SEQNUM?<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>                flushOpSeqId: earliestUnflushedSequenceIdForTheRegion.longValue() - 1;<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>      } else {<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>        // use the provided sequence Id as WAL is not being used for this flush.<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>        flushedSeqId = flushOpSeqId = myseqid;<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>      }<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span><a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>      for (HStore s : storesToFlush) {<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>        storeFlushCtxs.put(s.getColumnFamilyDescriptor().getName(),<a name="line.2531"></a>
-<span class="sourceLineNo">2532</span>          s.createFlushContext(flushOpSeqId, tracker));<a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>        // for writing stores to WAL<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>        committedFiles.put(s.getColumnFamilyDescriptor().getName(), null);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>      }<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span><a name="line.2536"></a>
-<span class="sourceLineNo">2537</span>      // write the snapshot start to WAL<a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>      if (wal != null &amp;&amp; !writestate.readOnly) {<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>        FlushDescriptor desc = ProtobufUtil.toFlushDescriptor(FlushAction.START_FLUSH,<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>            getRegionInfo(), flushOpSeqId, committedFiles);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>        // No sync. Sync is below where no updates lock and we do FlushAction.COMMIT_FLUSH<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>        WALUtil.writeFlushMarker(wal, this.getReplicationScope(), getRegionInfo(), desc, false,<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>            mvcc);<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>      }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span><a name="line.2545"></a>
-<span class="sourceLineNo">2546</span>      // Prepare flush (take a snapshot)<a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>      storeFlushCtxs.forEach((name, flush) -&gt; {<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>        MemStoreSize snapshotSize = flush.prepare();<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>        totalSizeOfFlushableStores.incMemStoreSize(snapshotSize);<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>        storeFlushableSize.put(name, snapshotSize);<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>      });<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    } catch (IOException ex) {<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>      doAbortFlushToWAL(wal, flushOpSeqId, committedFiles);<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>      throw ex;<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    } finally {<a name="line.2555"></a>
-<span class="sourceLineNo">2556</span>      this.updatesLock.writeLock().unlock();<a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    }<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    String s = "Finished memstore snapshotting " + this + ", syncing WAL and waiting on mvcc, " +<

<TRUNCATED>