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/09/11 14:54:05 UTC

[01/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 38e436c29 -> dcc97e016


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      for (long i =

<TRUNCATED>

[24/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
index 5512ead..478dff7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"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":9,"i16":10,"i17":10,"i18":9,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":9,"i26":10,"i27":10,"i28":9,"i29":10};
+var methods = {"i0":9,"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":9,"i15":10,"i16":10,"i17":9,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":9,"i25":10,"i26":10,"i27":9,"i28":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";
@@ -134,7 +134,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.97">TransitRegionStateProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.98">TransitRegionStateProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">AbstractStateMachineRegionProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&gt;</pre>
 <div class="block">The procedure to deal with the state transition of a region. A region with a TRSP in place is
  called RIT, i.e, RegionInTransition.
@@ -353,71 +353,67 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </td>
 </tr>
 <tr id="i7" class="rowColor">
-<td class="colFirst"><code>private long</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getBackoffTime-int-">getBackoffTime</a></span>(int&nbsp;attempts)</code>&nbsp;</td>
-</tr>
-<tr id="i8" class="altColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getInitialState--">getInitialState</a></span>()</code>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getProcedureMetrics-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">getProcedureMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Override this method to provide procedure specific counters for submitted count, failed
  count and time histogram.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getRegionStateNode-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">getRegionStateNode</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getState-int-">getState</a></span>(int&nbsp;stateId)</code>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>protected int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getStateId-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">getStateId</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)</code>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getTableOperationType--">getTableOperationType</a></span>()</code>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#incrementAndCheckMaxAttempts-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">incrementAndCheckMaxAttempts</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                             <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#move-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">move</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
     <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
     <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#openRegion-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">openRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
           <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#queueAssign-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">queueAssign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
            <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#reopen-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-">reopen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
       <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#reportTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
@@ -425,14 +421,14 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
                 org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;code,
                 long&nbsp;seqId)</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#reportTransitionClosed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-">reportTransitionClosed</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                       <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;code)</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#reportTransitionOpened-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-">reportTransitionOpened</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
@@ -440,50 +436,50 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;code,
                       long&nbsp;openSeqNum)</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">rollbackState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)</code>
 <div class="block">called to perform the rollback of the specified state</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">The user-level code of the procedure may have some state to
  persist (e.g.</div>
 </td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#serverCrashed-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-">serverCrashed</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
              <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
              <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#setOwner-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure-">setOwner</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;proc)</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">At end of timeout, wake ourselves up so we run again.</div>
 </td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#toStringClassDetails-java.lang.StringBuilder-">toStringClassDetails</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</code>
 <div class="block">Extend the toString() information with the procedure details
  e.g.</div>
 </td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#unassign-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-">unassign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
         <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">The <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doAcquireLock-TEnvironment-org.apache.hadoop.hbase.procedure2.store.ProcedureStore-"><code>Procedure.doAcquireLock(Object, ProcedureStore)</code></a> will be split into two steps, first, it will
@@ -547,7 +543,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.100">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.101">LOG</a></pre>
 </li>
 </ul>
 <a name="initialState">
@@ -556,7 +552,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>initialState</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.102">initialState</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.103">initialState</a></pre>
 </li>
 </ul>
 <a name="lastState">
@@ -565,7 +561,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>lastState</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.104">lastState</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.105">lastState</a></pre>
 </li>
 </ul>
 <a name="assignCandidate">
@@ -574,7 +570,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>assignCandidate</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.107">assignCandidate</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.108">assignCandidate</a></pre>
 </li>
 </ul>
 <a name="forceNewPlan">
@@ -583,7 +579,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>forceNewPlan</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.109">forceNewPlan</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.110">forceNewPlan</a></pre>
 </li>
 </ul>
 <a name="attempt">
@@ -592,7 +588,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>attempt</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.111">attempt</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.112">attempt</a></pre>
 </li>
 </ul>
 </li>
@@ -609,7 +605,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>TransitRegionStateProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.113">TransitRegionStateProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.114">TransitRegionStateProcedure</a>()</pre>
 </li>
 </ul>
 <a name="TransitRegionStateProcedure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-boolean-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">
@@ -618,7 +614,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TransitRegionStateProcedure</h4>
-<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.116">TransitRegionStateProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.117">TransitRegionStateProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
                                     <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;assignCandidate,
                                     boolean&nbsp;forceNewPlan,
@@ -640,7 +636,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.127">getTableOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.128">getTableOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.
  e.g. if we get a delete and we have some table operation pending (e.g. add column)
@@ -661,7 +657,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>waitInitialized</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.133">waitInitialized</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/assignment/TransitRegionStateProcedure.html#line.134">waitInitialized</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#waitInitialized-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doAcquireLock-TEnvironment-org.apache.hadoop.hbase.procedure2.store.ProcedureStore-"><code>Procedure.doAcquireLock(Object, ProcedureStore)</code></a> will be split into two steps, first, it will
  call us to determine whether we need to wait for initialization, second, it will call
@@ -686,7 +682,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>queueAssign</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.143">queueAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.144">queueAssign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                          <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
                   throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a></pre>
 <dl>
@@ -701,7 +697,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>openRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.168">openRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.169">openRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
                  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>
@@ -716,7 +712,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>confirmOpened</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.181">confirmOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.182">confirmOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                  <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
                                           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>
@@ -731,7 +727,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.219">closeRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.220">closeRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                          <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
                   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>
@@ -746,7 +742,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>confirmClosed</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.233">confirmClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.234">confirmClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                  <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)
                                           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>
@@ -761,7 +757,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.277">execute</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.278">execute</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="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                               <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</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>
@@ -791,7 +787,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStateNode</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.289">getRegionStateNode</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>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.290">getRegionStateNode</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>
 </li>
 </ul>
 <a name="executeFromState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState-">
@@ -800,7 +796,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.294">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.295">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -827,7 +823,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeoutFailure</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.339">setTimeoutFailure</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/assignment/TransitRegionStateProcedure.html#line.340">setTimeoutFailure</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">At end of timeout, wake ourselves up so we run again.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -844,7 +840,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>reportTransitionOpened</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.345">reportTransitionOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.346">reportTransitionOpened</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                     <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                                     <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                     org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;code,
@@ -862,7 +858,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>reportTransitionClosed</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.380">reportTransitionClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.381">reportTransitionClosed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                     <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                                     <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                     org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;code)
@@ -879,7 +875,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>reportTransition</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.398">reportTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.399">reportTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                              <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                              <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;code,
@@ -897,7 +893,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>serverCrashed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.414">serverCrashed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.415">serverCrashed</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                           <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                           <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
                    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>
@@ -907,22 +903,13 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </dl>
 </li>
 </ul>
-<a name="getBackoffTime-int-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>getBackoffTime</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.444">getBackoffTime</a>(int&nbsp;attempts)</pre>
-</li>
-</ul>
 <a name="incrementAndCheckMaxAttempts-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementAndCheckMaxAttempts</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.450">incrementAndCheckMaxAttempts</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.445">incrementAndCheckMaxAttempts</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                              <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
@@ -932,7 +919,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.460">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.454">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                              <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>
@@ -954,7 +941,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.467">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.461">getState</a>(int&nbsp;stateId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getState-int-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 <dl>
@@ -973,7 +960,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.472">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.466">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getStateId-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 <dl>
@@ -992,7 +979,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.477">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.471">getInitialState</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getInitialState--">StateMachineProcedure</a></code></span></div>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 <dl>
@@ -1009,7 +996,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.482">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/assignment/TransitRegionStateProcedure.html#line.476">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
@@ -1031,7 +1018,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.493">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/assignment/TransitRegionStateProcedure.html#line.487">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
@@ -1052,7 +1039,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureMetrics</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.506">getProcedureMetrics</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;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureMetrics.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureMetrics</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.500">getProcedureMetrics</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#getProcedureMetrics-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Override this method to provide procedure specific counters for submitted count, failed
  count and time histogram.</div>
@@ -1072,7 +1059,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringClassDetails</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.516">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.510">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClassDetails-java.lang.StringBuilder-">Procedure</a></code></span></div>
 <div class="block">Extend the toString() information with the procedure details
  e.g. className and parameters</div>
@@ -1090,7 +1077,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>setOwner</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.527">setOwner</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.521">setOwner</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                     <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;proc)</pre>
 </li>
 </ul>
@@ -1100,7 +1087,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>assign</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.536">assign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.530">assign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                  <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                                  @Nullable
                                                  <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)</pre>
@@ -1112,7 +1099,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>unassign</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.544">unassign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.538">unassign</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                    <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
 </li>
 </ul>
@@ -1122,7 +1109,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>reopen</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.551">reopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.545">reopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                  <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
 </li>
 </ul>
@@ -1132,7 +1119,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>move</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.558">move</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#line.552">move</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                                @Nullable
                                                <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)</pre>

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


[13/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
index 97d2cac..1ebbce0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
@@ -126,7 +126,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.60">TestProcedureUtil.TestProcedureNoDefaultConstructor</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.71">TestProcedureUtil.TestProcedureNoDefaultConstructor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.TestProcedure</a></pre>
 </li>
 </ul>
@@ -235,7 +235,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTest
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestProcedureNoDefaultConstructor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html#line.61">TestProcedureNoDefaultConstructor</a>(int&nbsp;x)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html#line.72">TestProcedureNoDefaultConstructor</a>(int&nbsp;x)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
index 7a42a26..a269fc7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10};
 var tabs = {65535:["t0","All 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/procedure2/TestProcedureUtil.html#line.33">TestProcedureUtil</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.34">TestProcedureUtil</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>
@@ -190,10 +190,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#testNoDefaultConstructorValidation--">testNoDefaultConstructorValidation</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#testGetBackoffTimeMs--">testGetBackoffTimeMs</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#testNoDefaultConstructorValidation--">testNoDefaultConstructorValidation</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/procedure2/TestProcedureUtil.html#testValidation--">testValidation</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -224,7 +228,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <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/procedure2/TestProcedureUtil.html#line.36">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/procedure2/TestProcedureUtil.html#line.37">CLASS_RULE</a></pre>
 </li>
 </ul>
 </li>
@@ -241,7 +245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestProcedureUtil</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.33">TestProcedureUtil</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.34">TestProcedureUtil</a>()</pre>
 </li>
 </ul>
 </li>
@@ -258,7 +262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testValidation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.40">testValidation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.41">testValidation</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>
@@ -272,7 +276,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoDefaultConstructorValidation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.45">testNoDefaultConstructorValidation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.46">testNoDefaultConstructorValidation</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>
@@ -283,10 +287,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testConvert--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testConvert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.50">testConvert</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.51">testConvert</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>
@@ -294,6 +298,15 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testGetBackoffTimeMs--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testGetBackoffTimeMs</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#line.62">testGetBackoffTimeMs</a>()</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
index 60cb170..9d970d0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4266">TestHRegion.Appender</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4271">TestHRegion.Appender</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></pre>
 <div class="block">TestCase for append</div>
@@ -228,7 +228,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4267">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4272">region</a></pre>
 </li>
 </ul>
 <a name="appendRow">
@@ -237,7 +237,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>appendRow</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4268">appendRow</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4273">appendRow</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -246,7 +246,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>family</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4269">family</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4274">family</a></pre>
 </li>
 </ul>
 <a name="qualifier">
@@ -255,7 +255,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4270">qualifier</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4275">qualifier</a></pre>
 </li>
 </ul>
 <a name="CHAR">
@@ -264,7 +264,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>CHAR</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4271">CHAR</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4276">CHAR</a></pre>
 </li>
 </ul>
 <a name="appendCounter">
@@ -273,7 +273,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>appendCounter</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4272">appendCounter</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4277">appendCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -290,7 +290,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Appender</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4274">Appender</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4279">Appender</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                 int&nbsp;appendCounter)</pre>
 </li>
 </ul>
@@ -308,7 +308,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4280">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4285">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
index f40d338..ad90ae5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3489">TestHRegion.FlushThread</a>
+<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3492">TestHRegion.FlushThread</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -255,7 +255,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3490">done</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3493">done</a></pre>
 </li>
 </ul>
 <a name="error">
@@ -264,7 +264,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>error</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3491">error</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3494">error</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushThread</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3493">FlushThread</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3496">FlushThread</a>()</pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3497">done</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3500">done</a>()</pre>
 </li>
 </ul>
 <a name="checkNoError--">
@@ -307,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoError</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3504">checkNoError</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3507">checkNoError</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -316,7 +316,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3511">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3514">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -331,7 +331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3538">flush</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3541">flush</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
index d533f19..e9790e6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1300">TestHRegion.GetTillDoneOrException</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1302">TestHRegion.GetTillDoneOrException</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>g</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.Get <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1301">g</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.Get <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1303">g</a></pre>
 </li>
 </ul>
 <a name="done">
@@ -263,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private 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/TestHRegion.GetTillDoneOrException.html#line.1302">done</a></pre>
+<pre>private 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/TestHRegion.GetTillDoneOrException.html#line.1304">done</a></pre>
 </li>
 </ul>
 <a name="count">
@@ -272,7 +272,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>count</h4>
-<pre>private 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/TestHRegion.GetTillDoneOrException.html#line.1303">count</a></pre>
+<pre>private 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/TestHRegion.GetTillDoneOrException.html#line.1305">count</a></pre>
 </li>
 </ul>
 <a name="e">
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>e</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1304">e</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1306">e</a></pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>GetTillDoneOrException</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1306">GetTillDoneOrException</a>(int&nbsp;i,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1308">GetTillDoneOrException</a>(int&nbsp;i,
                        byte[]&nbsp;r,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a>&nbsp;d,
                        <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>&nbsp;c)</pre>
@@ -318,7 +318,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1315">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1317">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
index 0b19617..2d83a9a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6241">TestHRegion.HRegionForTesting</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6244">TestHRegion.HRegionForTesting</a>
 extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <div class="block">The same as HRegion class, the only difference is that instantiateHStore will
  create a different HStore - HStoreForTesting. [HBASE-8518]</div>
@@ -259,7 +259,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>HRegionForTesting</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6243">HRegionForTesting</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6246">HRegionForTesting</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                          org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                          org.apache.hadoop.fs.FileSystem&nbsp;fs,
                          org.apache.hadoop.conf.Configuration&nbsp;confParam,
@@ -274,7 +274,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegionForTesting</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6250">HRegionForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6253">HRegionForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;fs,
                          org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                          org.apache.hadoop.conf.Configuration&nbsp;confParam,
                          org.apache.hadoop.hbase.client.TableDescriptor&nbsp;htd,
@@ -295,7 +295,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>instantiateHStore</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HStore&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6261">instantiateHStore</a>(org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family)
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HStore&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6264">instantiateHStore</a>(org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family)
                                                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Create HStore instance.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
index 154d124..9af1730 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5619">TestHRegion.HRegionWithSeqId</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5624">TestHRegion.HRegionWithSeqId</a>
 extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 </li>
 </ul>
@@ -248,7 +248,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegionWithSeqId</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5620">HRegionWithSeqId</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5625">HRegionWithSeqId</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                         org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                         org.apache.hadoop.fs.FileSystem&nbsp;fs,
                         org.apache.hadoop.conf.Configuration&nbsp;confParam,
@@ -271,7 +271,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getNextSequenceId</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5626">getNextSequenceId</a>(org.apache.hadoop.hbase.wal.WAL&nbsp;wal)
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5631">getNextSequenceId</a>(org.apache.hadoop.hbase.wal.WAL&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>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
index d1d6555..b16d926 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6283">TestHRegion.HStoreForTesting</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6286">TestHRegion.HStoreForTesting</a>
 extends org.apache.hadoop.hbase.regionserver.HStore</pre>
 <div class="block">HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method
  of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which
@@ -234,7 +234,7 @@ extends org.apache.hadoop.hbase.regionserver.HStore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HStoreForTesting</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6285">HStoreForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6288">HStoreForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                            org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family,
                            org.apache.hadoop.conf.Configuration&nbsp;confParam)
                     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>
@@ -258,7 +258,7 @@ extends org.apache.hadoop.hbase.regionserver.HStore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doCompaction</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6292">doCompaction</a>(org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl&nbsp;cr,
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6295">doCompaction</a>(org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl&nbsp;cr,
                                                                              <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;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;filesToCompact,
                                                                              org.apache.hadoop.hbase.security.User&nbsp;user,
                                                                              long&nbsp;compactionStartTime,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
index 928c9fc..c23d0c6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4180">TestHRegion.Incrementer</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4185">TestHRegion.Incrementer</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></pre>
 <div class="block">TestCase for increment</div>
@@ -228,7 +228,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4181">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4186">region</a></pre>
 </li>
 </ul>
 <a name="incRow">
@@ -237,7 +237,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>incRow</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4182">incRow</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4187">incRow</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -246,7 +246,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>family</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4183">family</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4188">family</a></pre>
 </li>
 </ul>
 <a name="qualifier">
@@ -255,7 +255,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4184">qualifier</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4189">qualifier</a></pre>
 </li>
 </ul>
 <a name="ONE">
@@ -264,7 +264,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>ONE</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4185">ONE</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4190">ONE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestHRegion.Incrementer.ONE">Constant Field Values</a></dd>
@@ -277,7 +277,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>incCounter</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4186">incCounter</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4191">incCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -294,7 +294,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Incrementer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4188">Incrementer</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4193">Incrementer</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                    int&nbsp;incCounter)</pre>
 </li>
 </ul>
@@ -312,7 +312,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4194">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4199">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
index baec8c1..172d81f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1100">TestHRegion.IsFlushWALMarker</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1101">TestHRegion.IsFlushWALMarker</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt;</pre>
 </li>
@@ -210,7 +210,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockListLast">
 <li class="blockList">
 <h4>actions</h4>
-<pre>volatile&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1101">actions</a></pre>
+<pre>volatile&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1102">actions</a></pre>
 </li>
 </ul>
 </li>
@@ -227,7 +227,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IsFlushWALMarker</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1102">IsFlushWALMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1103">IsFlushWALMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
 </li>
 </ul>
 </li>
@@ -244,7 +244,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockList">
 <li class="blockList">
 <h4>matches</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1106">matches</a>(org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1107">matches</a>(org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>matches</code>&nbsp;in interface&nbsp;<code>org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt;</code></dd>
@@ -257,7 +257,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockListLast">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.IsFlushWALMarker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1129">set</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.IsFlushWALMarker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1130">set</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
index 5882e90..efd61b9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3644">TestHRegion.PutThread</a>
+<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3647">TestHRegion.PutThread</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -277,7 +277,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3645">done</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3648">done</a></pre>
 </li>
 </ul>
 <a name="numPutsFinished">
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numPutsFinished</h4>
-<pre>private volatile&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3646">numPutsFinished</a></pre>
+<pre>private volatile&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3649">numPutsFinished</a></pre>
 </li>
 </ul>
 <a name="error">
@@ -295,7 +295,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>error</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3648">error</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3651">error</a></pre>
 </li>
 </ul>
 <a name="numRows">
@@ -304,7 +304,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numRows</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3649">numRows</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3652">numRows</a></pre>
 </li>
 </ul>
 <a name="families">
@@ -313,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>families</h4>
-<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3650">families</a></pre>
+<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3653">families</a></pre>
 </li>
 </ul>
 <a name="qualifiers">
@@ -322,7 +322,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>qualifiers</h4>
-<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3651">qualifiers</a></pre>
+<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3654">qualifiers</a></pre>
 </li>
 </ul>
 </li>
@@ -339,7 +339,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PutThread</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3653">PutThread</a>(int&nbsp;numRows,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3656">PutThread</a>(int&nbsp;numRows,
                   byte[][]&nbsp;families,
                   byte[][]&nbsp;qualifiers)</pre>
 </li>
@@ -358,7 +358,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForFirstPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3663">waitForFirstPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3666">waitForFirstPut</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Block calling thread until this instance of PutThread has put at least one row.</div>
 <dl>
@@ -373,7 +373,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3671">done</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3674">done</a>()</pre>
 </li>
 </ul>
 <a name="checkNoError--">
@@ -382,7 +382,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoError</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3678">checkNoError</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3681">checkNoError</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -391,7 +391,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3685">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3688">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>


[11/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 4cff7b7..cf08121 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -669,10 +669,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/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/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/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 29ba8c2..f42becb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,10 +253,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.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/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>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index 95faacf..c2cff41 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -3319,6 +3319,7 @@
 <li type="circle">org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/TestRemoteHTableRetries.html" title="class in org.apache.hadoop.hbase.rest.client"><span class="typeNameLink">TestRemoteHTableRetries</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/TestRemoteTable.html" title="class in org.apache.hadoop.hbase.rest.client"><span class="typeNameLink">TestRemoteTable</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRemoveRegionMetrics.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRemoveRegionMetrics</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestReopenTableRegionsProcedureBackoff</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestReplicasClient.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestReplicasClient</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestReplicasClient.SlowMeCopro.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestReplicasClient.SlowMeCopro</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
 <li type="circle">org.apache.hadoop.hbase.client.replication.<a href="org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.html" title="class in org.apache.hadoop.hbase.client.replication"><span class="typeNameLink">TestReplicationAdmin</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html
new file mode 100644
index 0000000..5286a0f
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html
@@ -0,0 +1,202 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.master.procedure;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import static org.junit.Assert.assertTrue;<a name="line.20"></a>
+<span class="sourceLineNo">021</span><a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.TableName;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.master.ServerManager;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.master.assignment.RegionStateNode;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.junit.AfterClass;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.junit.BeforeClass;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.junit.ClassRule;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.junit.Test;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.junit.experimental.categories.Category;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.slf4j.Logger;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.LoggerFactory;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>/**<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * Confirm that we will do backoff when retrying on reopening table regions, to avoid consuming all<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * the CPUs.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> */<a name="line.49"></a>
+<span class="sourceLineNo">050</span>@Category({ MasterTests.class, MediumTests.class })<a name="line.50"></a>
+<span class="sourceLineNo">051</span>public class TestReopenTableRegionsProcedureBackoff {<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  @ClassRule<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    HBaseClassTestRule.forClass(TestReopenTableRegionsProcedureBackoff.class);<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final Logger LOG =<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    LoggerFactory.getLogger(TestReopenTableRegionsProcedureBackoff.class);<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static TableName TABLE_NAME = TableName.valueOf("Backoff");<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  private static byte[] CF = Bytes.toBytes("cf");<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  @BeforeClass<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  public static void setUp() throws Exception {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    UTIL.getConfiguration().setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, 1);<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    UTIL.startMiniCluster(1);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    UTIL.createTable(TABLE_NAME, CF);<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>  @AfterClass<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  public static void tearDown() throws Exception {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    UTIL.shutdownMiniCluster();<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>  @Test<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  public void testRetryBackoff() throws IOException, InterruptedException {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    AssignmentManager am = UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec =<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    RegionInfo regionInfo = UTIL.getAdmin().getRegions(TABLE_NAME).get(0);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    RegionStateNode regionNode = am.getRegionStates().getRegionStateNode(regionInfo);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    // just a dummy one<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    TransitRegionStateProcedure trsp =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      TransitRegionStateProcedure.unassign(procExec.getEnvironment(), regionInfo);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    long openSeqNum;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    regionNode.lock();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    try {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      openSeqNum = regionNode.getOpenSeqNum();<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      // make a fake state to let the procedure wait.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      regionNode.setState(State.OPENING);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      regionNode.setOpenSeqNum(-1L);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      regionNode.setProcedure(trsp);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    } finally {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      regionNode.unlock();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    ReopenTableRegionsProcedure proc = new ReopenTableRegionsProcedure(TABLE_NAME);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    procExec.submitProcedure(proc);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    UTIL.waitFor(10000, () -&gt; proc.getState() == ProcedureState.WAITING_TIMEOUT);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    long oldTimeout = 0;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    int timeoutIncrements = 0;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    for (;;) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      long timeout = proc.getTimeout();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      if (timeout &gt; oldTimeout) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>        LOG.info("Timeout incremented, was {}, now is {}, increments={}", timeout, oldTimeout,<a name="line.107"></a>
+<span class="sourceLineNo">108</span>          timeoutIncrements);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        oldTimeout = timeout;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        timeoutIncrements++;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        if (timeoutIncrements &gt; 3) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>          // If we incremented at least twice, break; the backoff is working.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          break;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      Thread.sleep(1000);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    regionNode.lock();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    try {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      // reset to the correct state<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      regionNode.setState(State.OPEN);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      regionNode.setOpenSeqNum(openSeqNum);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      regionNode.unsetProcedure(trsp);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    } finally {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      regionNode.unlock();<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    ProcedureSyncWait.waitForProcedureToComplete(procExec, proc, 60000);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    assertTrue(regionNode.getOpenSeqNum() &gt; openSeqNum);<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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
index 097ef37..db6f050 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.TestProcedureNoDefaultConstructor.html
@@ -27,48 +27,59 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertEquals;<a name="line.20"></a>
 <span class="sourceLineNo">021</span><a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility.TestProcedure;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.junit.ClassRule;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.junit.Test;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.junit.experimental.categories.Category;<a name="line.28"></a>
-<span class="sourceLineNo">029</span><a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>@Category({MasterTests.class, SmallTests.class})<a name="line.32"></a>
-<span class="sourceLineNo">033</span>public class TestProcedureUtil {<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>  @ClassRule<a name="line.35"></a>
-<span class="sourceLineNo">036</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.36"></a>
-<span class="sourceLineNo">037</span>      HBaseClassTestRule.forClass(TestProcedureUtil.class);<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>  @Test<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  public void testValidation() throws Exception {<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    ProcedureUtil.validateClass(new TestProcedure(10));<a name="line.41"></a>
-<span class="sourceLineNo">042</span>  }<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  @Test(expected = BadProcedureException.class)<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  public void testNoDefaultConstructorValidation() throws Exception {<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    ProcedureUtil.validateClass(new TestProcedureNoDefaultConstructor(1));<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>  @Test<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  public void testConvert() throws Exception {<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    // check Procedure to protobuf conversion<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    final TestProcedure proc1 = new TestProcedure(10, 1, new byte[] { 65 });<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    final ProcedureProtos.Procedure proto1 = ProcedureUtil.convertToProtoProcedure(proc1);<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    final TestProcedure proc2 = (TestProcedure)ProcedureUtil.convertToProcedure(proto1);<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    final ProcedureProtos.Procedure proto2 = ProcedureUtil.convertToProtoProcedure(proc2);<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    assertEquals(false, proto2.hasResult());<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    assertEquals("Procedure protobuf does not match", proto1, proto2);<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  public static class TestProcedureNoDefaultConstructor extends TestProcedure {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    public TestProcedureNoDefaultConstructor(int x) {}<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">022</span>import java.util.concurrent.TimeUnit;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility.TestProcedure;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.junit.ClassRule;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.junit.Test;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.junit.experimental.categories.Category;<a name="line.29"></a>
+<span class="sourceLineNo">030</span><a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>@Category({ MasterTests.class, SmallTests.class })<a name="line.33"></a>
+<span class="sourceLineNo">034</span>public class TestProcedureUtil {<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>  @ClassRule<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.37"></a>
+<span class="sourceLineNo">038</span>    HBaseClassTestRule.forClass(TestProcedureUtil.class);<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>  @Test<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  public void testValidation() throws Exception {<a name="line.41"></a>
+<span class="sourceLineNo">042</span>    ProcedureUtil.validateClass(new TestProcedure(10));<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>  @Test(expected = BadProcedureException.class)<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public void testNoDefaultConstructorValidation() throws Exception {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    ProcedureUtil.validateClass(new TestProcedureNoDefaultConstructor(1));<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>  @Test<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  public void testConvert() throws Exception {<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    // check Procedure to protobuf conversion<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    final TestProcedure proc1 = new TestProcedure(10, 1, new byte[] { 65 });<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    final ProcedureProtos.Procedure proto1 = ProcedureUtil.convertToProtoProcedure(proc1);<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    final TestProcedure proc2 = (TestProcedure)ProcedureUtil.convertToProcedure(proto1);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    final ProcedureProtos.Procedure proto2 = ProcedureUtil.convertToProtoProcedure(proc2);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    assertEquals(false, proto2.hasResult());<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    assertEquals("Procedure protobuf does not match", proto1, proto2);<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>  @Test<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  public void testGetBackoffTimeMs() {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    for (int i = 30; i &lt; 1000; i++) {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      assertEquals(TimeUnit.MINUTES.toMillis(10), ProcedureUtil.getBackoffTimeMs(30));<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    }<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    assertEquals(1000, ProcedureUtil.getBackoffTimeMs(0));<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    assertEquals(2000, ProcedureUtil.getBackoffTimeMs(1));<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    assertEquals(32000, ProcedureUtil.getBackoffTimeMs(5));<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  public static class TestProcedureNoDefaultConstructor extends TestProcedure {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    public TestProcedureNoDefaultConstructor(int x) {}<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
index 097ef37..db6f050 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html
@@ -27,48 +27,59 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertEquals;<a name="line.20"></a>
 <span class="sourceLineNo">021</span><a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility.TestProcedure;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.junit.ClassRule;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.junit.Test;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.junit.experimental.categories.Category;<a name="line.28"></a>
-<span class="sourceLineNo">029</span><a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>@Category({MasterTests.class, SmallTests.class})<a name="line.32"></a>
-<span class="sourceLineNo">033</span>public class TestProcedureUtil {<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>  @ClassRule<a name="line.35"></a>
-<span class="sourceLineNo">036</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.36"></a>
-<span class="sourceLineNo">037</span>      HBaseClassTestRule.forClass(TestProcedureUtil.class);<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>  @Test<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  public void testValidation() throws Exception {<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    ProcedureUtil.validateClass(new TestProcedure(10));<a name="line.41"></a>
-<span class="sourceLineNo">042</span>  }<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  @Test(expected = BadProcedureException.class)<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  public void testNoDefaultConstructorValidation() throws Exception {<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    ProcedureUtil.validateClass(new TestProcedureNoDefaultConstructor(1));<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>  @Test<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  public void testConvert() throws Exception {<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    // check Procedure to protobuf conversion<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    final TestProcedure proc1 = new TestProcedure(10, 1, new byte[] { 65 });<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    final ProcedureProtos.Procedure proto1 = ProcedureUtil.convertToProtoProcedure(proc1);<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    final TestProcedure proc2 = (TestProcedure)ProcedureUtil.convertToProcedure(proto1);<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    final ProcedureProtos.Procedure proto2 = ProcedureUtil.convertToProtoProcedure(proc2);<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    assertEquals(false, proto2.hasResult());<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    assertEquals("Procedure protobuf does not match", proto1, proto2);<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>  public static class TestProcedureNoDefaultConstructor extends TestProcedure {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    public TestProcedureNoDefaultConstructor(int x) {}<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">022</span>import java.util.concurrent.TimeUnit;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility.TestProcedure;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.testclassification.MasterTests;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.junit.ClassRule;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.junit.Test;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.junit.experimental.categories.Category;<a name="line.29"></a>
+<span class="sourceLineNo">030</span><a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>@Category({ MasterTests.class, SmallTests.class })<a name="line.33"></a>
+<span class="sourceLineNo">034</span>public class TestProcedureUtil {<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>  @ClassRule<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.37"></a>
+<span class="sourceLineNo">038</span>    HBaseClassTestRule.forClass(TestProcedureUtil.class);<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>  @Test<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  public void testValidation() throws Exception {<a name="line.41"></a>
+<span class="sourceLineNo">042</span>    ProcedureUtil.validateClass(new TestProcedure(10));<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>  @Test(expected = BadProcedureException.class)<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public void testNoDefaultConstructorValidation() throws Exception {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    ProcedureUtil.validateClass(new TestProcedureNoDefaultConstructor(1));<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>  @Test<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  public void testConvert() throws Exception {<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    // check Procedure to protobuf conversion<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    final TestProcedure proc1 = new TestProcedure(10, 1, new byte[] { 65 });<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    final ProcedureProtos.Procedure proto1 = ProcedureUtil.convertToProtoProcedure(proc1);<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    final TestProcedure proc2 = (TestProcedure)ProcedureUtil.convertToProcedure(proto1);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    final ProcedureProtos.Procedure proto2 = ProcedureUtil.convertToProtoProcedure(proc2);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    assertEquals(false, proto2.hasResult());<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    assertEquals("Procedure protobuf does not match", proto1, proto2);<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>  @Test<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  public void testGetBackoffTimeMs() {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    for (int i = 30; i &lt; 1000; i++) {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      assertEquals(TimeUnit.MINUTES.toMillis(10), ProcedureUtil.getBackoffTimeMs(30));<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    }<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    assertEquals(1000, ProcedureUtil.getBackoffTimeMs(0));<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    assertEquals(2000, ProcedureUtil.getBackoffTimeMs(1));<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    assertEquals(32000, ProcedureUtil.getBackoffTimeMs(5));<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  public static class TestProcedureNoDefaultConstructor extends TestProcedure {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    public TestProcedureNoDefaultConstructor(int x) {}<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>
 
 
 


[03/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</s

<TRUNCATED>

[10/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class

<TRUNCATED>

[04/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></

<TRUNCATED>

[14/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 6c00a4a..d5b615b 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -3357,6 +3357,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#CF">CF</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedurePriority</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#CF">CF</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.html#CF">CF</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.html" title="class in org.apache.hadoop.hbase.master">TestMasterAbortAndRSGotKilled</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMergeTableRegionsWhileRSCrash.html#CF">CF</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMergeTableRegionsWhileRSCrash.html" title="class in org.apache.hadoop.hbase.master">TestMergeTableRegionsWhileRSCrash</a></dt>
@@ -5159,6 +5161,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedurePriority</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
@@ -23775,6 +23779,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedureAdmin</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
@@ -37029,6 +37035,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#setUp--">setUp()</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedurePriority</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#setUp--">setUp()</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
@@ -41441,6 +41449,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/cleaner/TestSnapshotFromMaster.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.master.cleaner.<a href="org/apache/hadoop/hbase/master/cleaner/TestSnapshotFromMaster.html" title="class in org.apache.hadoop.hbase.master.cleaner">TestSnapshotFromMaster</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTableDescriptorModificationFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.html" title="class in org.apache.hadoop.hbase.master">TestMasterAbortAndRSGotKilled</a></dt>
@@ -42333,6 +42343,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#tearDown--">tearDown()</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedurePriority</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#tearDown--">tearDown()</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
@@ -51273,6 +51285,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/TestBufferChain.html#testGetBackBytesWePutIn--">testGetBackBytesWePutIn()</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBufferChain.html" title="class in org.apache.hadoop.hbase.ipc">TestBufferChain</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html#testGetBackoffTimeMs--">testGetBackoffTimeMs()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureUtil</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestTableSnapshotInputFormat.html#testGetBestLocations--">testGetBestLocations()</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestTableSnapshotInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TestTableSnapshotInputFormat</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupUtils.html#TestGetBulkOutputDir--">TestGetBulkOutputDir()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupUtils.html" title="class in org.apache.hadoop.hbase.backup">TestBackupUtils</a></dt>
@@ -59080,6 +59094,13 @@
 <dd>
 <div class="block">Test copy of table from sourceTable to targetTable all rows from family a</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestReopenTableRegionsProcedureBackoff</span></a> - Class in <a href="org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></dt>
+<dd>
+<div class="block">Confirm that we will do backoff when retrying on reopening table regions, to avoid consuming all
+ the CPUs.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#TestReopenTableRegionsProcedureBackoff--">TestReopenTableRegionsProcedureBackoff()</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestRepairAfterFailedDelete</span></a> - Class in <a href="org/apache/hadoop/hbase/backup/package-summary.html">org.apache.hadoop.hbase.backup</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html#TestRepairAfterFailedDelete--">TestRepairAfterFailedDelete()</a></span> - Constructor for class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.apache.hadoop.hbase.backup">TestRepairAfterFailedDelete</a></dt>
@@ -59806,6 +59827,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestCloseRegionWhileRSCrash.html#testRetryBackoff--">testRetryBackoff()</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestCloseRegionWhileRSCrash.html" title="class in org.apache.hadoop.hbase.master.assignment">TestCloseRegionWhileRSCrash</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#testRetryBackoff--">testRetryBackoff()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/util/TestRetryCounter.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">TestRetryCounter</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">Basic test for some old functionality we don't seem to have used but that looks nice.</div>
@@ -67025,6 +67048,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedurePriority</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html#util">util</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestServerCrashProcedure</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 2d9b60f..6af42fe 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -146,8 +146,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.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index 8e337b5..7986a3a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -3665,90 +3665,94 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestCreateNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestReopenTableRegionsProcedureBackoff.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestCreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestCreateNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestModifyNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestModifyNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestFastFailOnProcedureNotRegistered.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestFastFailOnProcedureNotRegistered.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestModifyNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestModifyNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestDisableTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDisableTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestFastFailOnProcedureNotRegistered.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestFastFailOnProcedureNotRegistered.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestProcedurePriority.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestDisableTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDisableTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterProcedureEvents.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureEvents.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestProcedurePriority.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestTruncateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterProcedureEvents.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureEvents.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestDeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestTruncateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterObserverPostCalls.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterObserverPostCalls.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestDeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWALProcedureStoreOnHDFS.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterObserverPostCalls.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterObserverPostCalls.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestEnableTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestEnableTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALProcedureStoreOnHDFS.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedureWithReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedureWithReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestEnableTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestEnableTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureScheduler.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedureWithReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedureWithReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSafemodeBringsDownMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterProcedureScheduler.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureScheduler.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestRestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSafemodeBringsDownMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterFailoverWithProcedures.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterFailoverWithProcedures.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestRestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMasterProcedureWalLease.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureWalLease.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterFailoverWithProcedures.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterFailoverWithProcedures.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestTableDescriptorModificationFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMasterProcedureWalLease.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureWalLease.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestDeleteColumnFamilyProcedureFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteColumnFamilyProcedureFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestTableDescriptorModificationFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCloneSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestCloneSnapshotProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestDeleteColumnFamilyProcedureFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteColumnFamilyProcedureFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestCloneSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestCloneSnapshotProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestProcedureAdmin.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
index ededc2b..a80758a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
@@ -2408,46 +2408,50 @@
 <td class="colLast"><span class="typeNameLabel">MasterProcedureSchedulerPerformanceEvaluation.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestReopenTableRegionsProcedureBackoff.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#UTIL">UTIL</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestCreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestCreateNamespaceProcedure.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestModifyNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestModifyNamespaceProcedure.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestProcedurePriority.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterProcedureEvents.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureEvents.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestDeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteNamespaceProcedure.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterObserverPostCalls.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterObserverPostCalls.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestWALProcedureStoreOnHDFS.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestSafemodeBringsDownMaster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterFailoverWithProcedures.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterFailoverWithProcedures.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMasterProcedureWalLease.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestMasterProcedureWalLease.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestProcedureAdmin.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
index 918e0f4..e96ddc9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" target="_top">Frames</a></li>
@@ -348,7 +348,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionObserver, org.apache.hadoop
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html
new file mode 100644
index 0000000..827d0ec
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html
@@ -0,0 +1,405 @@
+<!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>TestReopenTableRegionsProcedureBackoff (Apache HBase 3.0.0-SNAPSHOT Test 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="TestReopenTableRegionsProcedureBackoff (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":9,"i1":9,"i2":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";
+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/TestReopenTableRegionsProcedureBackoff.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/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" target="_top">Frames</a></li>
+<li><a href="TestReopenTableRegionsProcedureBackoff.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.master.procedure</div>
+<h2 title="Class TestReopenTableRegionsProcedureBackoff" class="title">Class TestReopenTableRegionsProcedureBackoff</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.master.procedure.TestReopenTableRegionsProcedureBackoff</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.51">TestReopenTableRegionsProcedureBackoff</a>
+extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
+<div class="block">Confirm that we will do backoff when retrying on reopening table regions, to avoid consuming all
+ the CPUs.</div>
+</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 static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#CF">CF</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static org.slf4j.Logger</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#LOG">LOG</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.TableName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#TABLE_NAME">TABLE_NAME</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#UTIL">UTIL</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/master/procedure/TestReopenTableRegionsProcedureBackoff.html#TestReopenTableRegionsProcedureBackoff--">TestReopenTableRegionsProcedureBackoff</a></span>()</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="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></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>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#setUp--">setUp</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#tearDown--">tearDown</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#testRetryBackoff--">testRetryBackoff</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#toString--" title="class or interface in java.lang">toString</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="CLASS_RULE">
+<!--   -->
+</a>
+<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/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.54">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="LOG">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>LOG</h4>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.57">LOG</a></pre>
+</li>
+</ul>
+<a name="UTIL">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>UTIL</h4>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.60">UTIL</a></pre>
+</li>
+</ul>
+<a name="TABLE_NAME">
+<!--   -->
+</a>
+<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/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.62">TABLE_NAME</a></pre>
+</li>
+</ul>
+<a name="CF">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>CF</h4>
+<pre>private static&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.64">CF</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="TestReopenTableRegionsProcedureBackoff--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestReopenTableRegionsProcedureBackoff</h4>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.51">TestReopenTableRegionsProcedureBackoff</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="setUp--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUp</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.67">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>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="tearDown--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDown</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.74">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>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testRetryBackoff--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testRetryBackoff</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html#line.79">testRetryBackoff</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>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
+</dl>
+</li>
+</ul>
+</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/TestReopenTableRegionsProcedureBackoff.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/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" target="_top">Frames</a></li>
+<li><a href="TestReopenTableRegionsProcedureBackoff.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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
index e621b3c..e252c8a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -646,7 +646,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestReopenTableRegionsProcedureBackoff.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestReopenTableRegionsProcedureBackoff.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestReopenTableRegionsProcedureBackoff.html
new file mode 100644
index 0000000..8bcda63
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestReopenTableRegionsProcedureBackoff.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.master.procedure.TestReopenTableRegionsProcedureBackoff (Apache HBase 3.0.0-SNAPSHOT Test 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.master.procedure.TestReopenTableRegionsProcedureBackoff (Apache HBase 3.0.0-SNAPSHOT Test 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/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">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/master/procedure/class-use/TestReopenTableRegionsProcedureBackoff.html" target="_top">Frames</a></li>
+<li><a href="TestReopenTableRegionsProcedureBackoff.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.master.procedure.TestReopenTableRegionsProcedureBackoff" class="title">Uses of Class<br>org.apache.hadoop.hbase.master.procedure.TestReopenTableRegionsProcedureBackoff</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.master.procedure.TestReopenTableRegionsProcedureBackoff</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/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">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/master/procedure/class-use/TestReopenTableRegionsProcedureBackoff.html" target="_top">Frames</a></li>
+<li><a href="TestReopenTableRegionsProcedureBackoff.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/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
index 7bc42ac..c966499 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
@@ -51,6 +51,7 @@
 <li><a href="TestProcedureAdmin.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestProcedureAdmin</a></li>
 <li><a href="TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestProcedurePriority</a></li>
 <li><a href="TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestProcedurePriority.MyCP</a></li>
+<li><a href="TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestReopenTableRegionsProcedureBackoff</a></li>
 <li><a href="TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestRestoreSnapshotProcedure</a></li>
 <li><a href="TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestSafemodeBringsDownMaster</a></li>
 <li><a href="TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestServerCrashProcedure</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
index 1a81dc2..a660d3f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
@@ -245,41 +245,48 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></td>
+<td class="colLast">
+<div class="block">Confirm that we will do backoff when retrying on reopening table regions, to avoid consuming all
+ the CPUs.</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestServerCrashProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedureWithReplicas.html" title="class in org.apache.hadoop.hbase.master.procedure">TestServerCrashProcedureWithReplicas</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDDLProcedureBase.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTableDDLProcedureBase</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTableDescriptorModificationFromClient</a></td>
 <td class="colLast">
 <div class="block">Verify that the HTableDescriptor is updated after
  addColumn(), deleteColumn() and modifyTable() operations.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure.TruncateTableProcedureOnHDFSFailure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure">TestWALProcedureStoreOnHDFS</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 3c933a1..d50ec57 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -150,6 +150,7 @@
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestProcedureAdmin</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestProcedurePriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestProcedurePriority.MyCP</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestReopenTableRegionsProcedureBackoff</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestSafemodeBringsDownMaster</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestServerCrashProcedure</span></a>
 <ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 611b575..8b2cdec 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -578,15 +578,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/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/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.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/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.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/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/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
 </ul>
 </li>
 </ul>


[02/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span 

<TRUNCATED>

[16/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
index 76e3c88..0d97a1c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
@@ -52,291 +52,308 @@
 <span class="sourceLineNo">044</span>  // ==========================================================================<a name="line.44"></a>
 <span class="sourceLineNo">045</span>  //  Reflection helpers to create/validate a Procedure object<a name="line.45"></a>
 <span class="sourceLineNo">046</span>  // ==========================================================================<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public static Procedure newProcedure(final String className) throws BadProcedureException {<a name="line.47"></a>
+<span class="sourceLineNo">047</span>  private static Procedure&lt;?&gt; newProcedure(String className) throws BadProcedureException {<a name="line.47"></a>
 <span class="sourceLineNo">048</span>    try {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      final Class&lt;?&gt; clazz = Class.forName(className);<a name="line.49"></a>
+<span class="sourceLineNo">049</span>      Class&lt;?&gt; clazz = Class.forName(className);<a name="line.49"></a>
 <span class="sourceLineNo">050</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.50"></a>
 <span class="sourceLineNo">051</span>        throw new Exception("the " + clazz + " class is not public");<a name="line.51"></a>
 <span class="sourceLineNo">052</span>      }<a name="line.52"></a>
 <span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>      final Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      assert ctor != null : "no constructor found";<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.56"></a>
-<span class="sourceLineNo">057</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.57"></a>
-<span class="sourceLineNo">058</span>      }<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      return (Procedure)ctor.newInstance();<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    } catch (Exception e) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      throw new BadProcedureException("The procedure class " + className +<a name="line.61"></a>
-<span class="sourceLineNo">062</span>          " must be accessible and have an empty constructor", e);<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    }<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public static void validateClass(final Procedure proc) throws BadProcedureException {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    try {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      final Class&lt;?&gt; clazz = proc.getClass();<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>        throw new Exception("the " + clazz + " class is not public");<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>      final Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      assert ctor != null;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    } catch (Exception e) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      throw new BadProcedureException("The procedure class " + proc.getClass().getName() +<a name="line.79"></a>
-<span class="sourceLineNo">080</span>          " must be accessible and have an empty constructor", e);<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><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // ==========================================================================<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //  convert to and from Procedure object<a name="line.85"></a>
+<span class="sourceLineNo">054</span>      @SuppressWarnings("rawtypes")<a name="line.54"></a>
+<span class="sourceLineNo">055</span>      Constructor&lt;? extends Procedure&gt; ctor = clazz.asSubclass(Procedure.class).getConstructor();<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      assert ctor != null : "no constructor found";<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      }<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      return ctor.newInstance();<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    } catch (Exception e) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      throw new BadProcedureException(<a name="line.62"></a>
+<span class="sourceLineNo">063</span>        "The procedure class " + className + " must be accessible and have an empty constructor",<a name="line.63"></a>
+<span class="sourceLineNo">064</span>        e);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    }<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>  static void validateClass(Procedure&lt;?&gt; proc) throws BadProcedureException {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    try {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      Class&lt;?&gt; clazz = proc.getClass();<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>        throw new Exception("the " + clazz + " class is not public");<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>      Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      assert ctor != null;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      }<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    } catch (Exception e) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      throw new BadProcedureException("The procedure class " + proc.getClass().getName() +<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        " must be accessible and have an empty constructor", e);<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>  // ==========================================================================<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 serializer for our Procedures. Instead of the previous serializer, it<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * uses the stateMessage list to store the internal state of the Procedures.<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static class StateSerializer implements ProcedureStateSerializer {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    private final ProcedureProtos.Procedure.Builder builder;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    private int deserializeIndex;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public StateSerializer(ProcedureProtos.Procedure.Builder builder) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      this.builder = builder;<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 void serialize(Message message) throws IOException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      Any packedMessage = Any.pack(message);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      builder.addStateMessage(packedMessage);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        throws IOException {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      if (deserializeIndex &gt;= builder.getStateMessageCount()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        throw new IOException("Invalid state message index: " + deserializeIndex);<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>      try {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        Any packedMessage = builder.getStateMessage(deserializeIndex++);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        return packedMessage.unpack(clazz);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      } catch (InvalidProtocolBufferException e) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        throw e.unwrapIOException();<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>  }<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 serializer (deserializer) for those Procedures which were serialized<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * before this patch. It deserializes the old, binary stateData field.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static class CompatStateSerializer implements ProcedureStateSerializer {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private InputStream inputStream;<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public CompatStateSerializer(InputStream inputStream) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this.inputStream = inputStream;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    public void serialize(Message message) throws IOException {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      throw new UnsupportedOperationException();<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>    @SuppressWarnings("unchecked")<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        throws IOException {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      Parser&lt;M&gt; parser = (Parser&lt;M&gt;) Internal.getDefaultInstance(clazz).getParserForType();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      try {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        return parser.parseDelimitedFrom(inputStream);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      } catch (InvalidProtocolBufferException e) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        throw e.unwrapIOException();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * Helper to convert the procedure to protobuf.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * Used by ProcedureStore implementations.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public static ProcedureProtos.Procedure convertToProtoProcedure(final Procedure proc)<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      throws IOException {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    Preconditions.checkArgument(proc != null);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    validateClass(proc);<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    final ProcedureProtos.Procedure.Builder builder = ProcedureProtos.Procedure.newBuilder()<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      .setClassName(proc.getClass().getName())<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      .setProcId(proc.getProcId())<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      .setState(proc.getState())<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      .setSubmittedTime(proc.getSubmittedTime())<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      .setLastUpdate(proc.getLastUpdate());<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>    if (proc.hasParent()) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      builder.setParentId(proc.getParentProcId());<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>    if (proc.hasTimeout()) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      builder.setTimeout(proc.getTimeout());<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>    if (proc.hasOwner()) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      builder.setOwner(proc.getOwner());<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>    final int[] stackIds = proc.getStackIndexes();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (stackIds != null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      for (int i = 0; i &lt; stackIds.length; ++i) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        builder.addStackId(stackIds[i]);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>    if (proc.hasException()) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      RemoteProcedureException exception = proc.getException();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      builder.setException(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        RemoteProcedureException.toProto(exception.getSource(), exception.getCause()));<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>    final byte[] result = proc.getResult();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    if (result != null) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      builder.setResult(UnsafeByteOperations.unsafeWrap(result));<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>    ProcedureStateSerializer serializer = new StateSerializer(builder);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    proc.serializeStateData(serializer);<a name="line.198"></a>
+<span class="sourceLineNo">087</span>  //  convert to and from Procedure object<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>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * A serializer for our Procedures. Instead of the previous serializer, it<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * uses the stateMessage list to store the internal state of the Procedures.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static class StateSerializer implements ProcedureStateSerializer {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    private final ProcedureProtos.Procedure.Builder builder;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    private int deserializeIndex;<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public StateSerializer(ProcedureProtos.Procedure.Builder builder) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      this.builder = builder;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>    @Override<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void serialize(Message message) throws IOException {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      Any packedMessage = Any.pack(message);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      builder.addStateMessage(packedMessage);<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>    @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        throws IOException {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      if (deserializeIndex &gt;= builder.getStateMessageCount()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        throw new IOException("Invalid state message index: " + deserializeIndex);<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>      try {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        Any packedMessage = builder.getStateMessage(deserializeIndex++);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        return packedMessage.unpack(clazz);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      } catch (InvalidProtocolBufferException e) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        throw e.unwrapIOException();<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>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * A serializer (deserializer) for those Procedures which were serialized<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * before this patch. It deserializes the old, binary stateData field.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static class CompatStateSerializer implements ProcedureStateSerializer {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    private InputStream inputStream;<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    public CompatStateSerializer(InputStream inputStream) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      this.inputStream = inputStream;<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>    @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    public void serialize(Message message) throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      throw new UnsupportedOperationException();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>    @SuppressWarnings("unchecked")<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        throws IOException {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      Parser&lt;M&gt; parser = (Parser&lt;M&gt;) Internal.getDefaultInstance(clazz).getParserForType();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        return parser.parseDelimitedFrom(inputStream);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      } catch (InvalidProtocolBufferException e) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        throw e.unwrapIOException();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<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>   * Helper to convert the procedure to protobuf.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * &lt;p/&gt;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * Used by ProcedureStore implementations.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  public static ProcedureProtos.Procedure convertToProtoProcedure(Procedure&lt;?&gt; proc)<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      throws IOException {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    Preconditions.checkArgument(proc != null);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    validateClass(proc);<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    final ProcedureProtos.Procedure.Builder builder = ProcedureProtos.Procedure.newBuilder()<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      .setClassName(proc.getClass().getName())<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      .setProcId(proc.getProcId())<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      .setState(proc.getState())<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      .setSubmittedTime(proc.getSubmittedTime())<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      .setLastUpdate(proc.getLastUpdate());<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    if (proc.hasParent()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      builder.setParentId(proc.getParentProcId());<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>    if (proc.hasTimeout()) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      builder.setTimeout(proc.getTimeout());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    if (proc.hasOwner()) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      builder.setOwner(proc.getOwner());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final int[] stackIds = proc.getStackIndexes();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    if (stackIds != null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      for (int i = 0; i &lt; stackIds.length; ++i) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        builder.addStackId(stackIds[i]);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (proc.hasException()) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      RemoteProcedureException exception = proc.getException();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      builder.setException(<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        RemoteProcedureException.toProto(exception.getSource(), exception.getCause()));<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>    final byte[] result = proc.getResult();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    if (result != null) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      builder.setResult(UnsafeByteOperations.unsafeWrap(result));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
 <span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (proc.getNonceKey() != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      builder.setNonceGroup(proc.getNonceKey().getNonceGroup());<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      builder.setNonce(proc.getNonceKey().getNonce());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>    if (proc.hasLock()) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      builder.setLocked(true);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (proc.isBypass()) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      builder.setBypass(true);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return builder.build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  /**<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * Helper to convert the protobuf procedure.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * Used by ProcedureStore implementations.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   *<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * TODO: OPTIMIZATION: some of the field never change during the execution<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   *                     (e.g. className, procId, parentId, ...).<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   *                     We can split in 'data' and 'state', and the store<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   *                     may take advantage of it by storing the data only on insert().<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  public static Procedure convertToProcedure(final ProcedureProtos.Procedure proto) throws IOException {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // Procedure from class name<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    final Procedure proc = newProcedure(proto.getClassName());<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    // set fields<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    proc.setProcId(proto.getProcId());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    proc.setState(proto.getState());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    proc.setSubmittedTime(proto.getSubmittedTime());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    proc.setLastUpdate(proto.getLastUpdate());<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (proto.hasParentId()) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      proc.setParentProcId(proto.getParentId());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">200</span>    ProcedureStateSerializer serializer = new StateSerializer(builder);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    proc.serializeStateData(serializer);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    if (proc.getNonceKey() != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      builder.setNonceGroup(proc.getNonceKey().getNonceGroup());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      builder.setNonce(proc.getNonceKey().getNonce());<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    if (proc.hasLock()) {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      builder.setLocked(true);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>    if (proc.isBypass()) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      builder.setBypass(true);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    return builder.build();<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>  /**<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * Helper to convert the protobuf procedure.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * &lt;p/&gt;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Used by ProcedureStore implementations.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * &lt;p/&gt;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * TODO: OPTIMIZATION: some of the field never change during the execution (e.g. className,<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * procId, parentId, ...). We can split in 'data' and 'state', and the store may take advantage of<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * it by storing the data only on insert().<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public static Procedure&lt;?&gt; convertToProcedure(ProcedureProtos.Procedure proto)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // Procedure from class name<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    Procedure&lt;?&gt; proc = newProcedure(proto.getClassName());<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // set fields<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    proc.setProcId(proto.getProcId());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    proc.setState(proto.getState());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    proc.setSubmittedTime(proto.getSubmittedTime());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    proc.setLastUpdate(proto.getLastUpdate());<a name="line.236"></a>
 <span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    if (proto.hasOwner()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      proc.setOwner(proto.getOwner());<a name="line.239"></a>
+<span class="sourceLineNo">238</span>    if (proto.hasParentId()) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      proc.setParentProcId(proto.getParentId());<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    if (proto.hasTimeout()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      proc.setTimeout(proto.getTimeout());<a name="line.243"></a>
+<span class="sourceLineNo">242</span>    if (proto.hasOwner()) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      proc.setOwner(proto.getOwner());<a name="line.243"></a>
 <span class="sourceLineNo">244</span>    }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (proto.getStackIdCount() &gt; 0) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      proc.setStackIndexes(proto.getStackIdList());<a name="line.247"></a>
+<span class="sourceLineNo">246</span>    if (proto.hasTimeout()) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      proc.setTimeout(proto.getTimeout());<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    }<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (proto.hasException()) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      assert proc.getState() == ProcedureProtos.ProcedureState.FAILED ||<a name="line.251"></a>
-<span class="sourceLineNo">252</span>             proc.getState() == ProcedureProtos.ProcedureState.ROLLEDBACK :<a name="line.252"></a>
-<span class="sourceLineNo">253</span>             "The procedure must be failed (waiting to rollback) or rolledback";<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      proc.setFailure(RemoteProcedureException.fromProto(proto.getException()));<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    if (proto.hasResult()) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      proc.setResult(proto.getResult().toByteArray());<a name="line.258"></a>
+<span class="sourceLineNo">250</span>    if (proto.getStackIdCount() &gt; 0) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      proc.setStackIndexes(proto.getStackIdList());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (proto.hasException()) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      assert proc.getState() == ProcedureProtos.ProcedureState.FAILED ||<a name="line.255"></a>
+<span class="sourceLineNo">256</span>             proc.getState() == ProcedureProtos.ProcedureState.ROLLEDBACK :<a name="line.256"></a>
+<span class="sourceLineNo">257</span>             "The procedure must be failed (waiting to rollback) or rolledback";<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      proc.setFailure(RemoteProcedureException.fromProto(proto.getException()));<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>    if (proto.getNonce() != HConstants.NO_NONCE) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      proc.setNonceKey(new NonceKey(proto.getNonceGroup(), proto.getNonce()));<a name="line.262"></a>
+<span class="sourceLineNo">261</span>    if (proto.hasResult()) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      proc.setResult(proto.getResult().toByteArray());<a name="line.262"></a>
 <span class="sourceLineNo">263</span>    }<a name="line.263"></a>
 <span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (proto.getLocked()) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      proc.lockedWhenLoading();<a name="line.266"></a>
+<span class="sourceLineNo">265</span>    if (proto.getNonce() != HConstants.NO_NONCE) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      proc.setNonceKey(new NonceKey(proto.getNonceGroup(), proto.getNonce()));<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    }<a name="line.267"></a>
 <span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>    if (proto.getBypass()) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      proc.bypass();<a name="line.270"></a>
+<span class="sourceLineNo">269</span>    if (proto.getLocked()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      proc.lockedWhenLoading();<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    }<a name="line.271"></a>
 <span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    ProcedureStateSerializer serializer = null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (proto.getStateMessageCount() &gt; 0) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      serializer = new StateSerializer(proto.toBuilder());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    } else if (proto.hasStateData()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      InputStream inputStream = proto.getStateData().newInput();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      serializer = new CompatStateSerializer(inputStream);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (serializer != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      proc.deserializeStateData(serializer);<a name="line.283"></a>
+<span class="sourceLineNo">273</span>    if (proto.getBypass()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      proc.bypass();<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>    ProcedureStateSerializer serializer = null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (proto.getStateMessageCount() &gt; 0) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      serializer = new StateSerializer(proto.toBuilder());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    } else if (proto.hasStateData()) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      InputStream inputStream = proto.getStateData().newInput();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      serializer = new CompatStateSerializer(inputStream);<a name="line.283"></a>
 <span class="sourceLineNo">284</span>    }<a name="line.284"></a>
 <span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    return proc;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  // ==========================================================================<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  //  convert from LockedResource object<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // ==========================================================================<a name="line.291"></a>
+<span class="sourceLineNo">286</span>    if (serializer != null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      proc.deserializeStateData(serializer);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return proc;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
 <span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>  public static LockServiceProtos.LockedResourceType convertToProtoResourceType(<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      LockedResourceType resourceType) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    return LockServiceProtos.LockedResourceType.valueOf(resourceType.name());<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>  public static LockServiceProtos.LockType convertToProtoLockType(LockType lockType) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    return LockServiceProtos.LockType.valueOf(lockType.name());<a name="line.299"></a>
+<span class="sourceLineNo">293</span>  // ==========================================================================<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  //  convert from LockedResource object<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  // ==========================================================================<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public static LockServiceProtos.LockedResourceType convertToProtoResourceType(<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LockedResourceType resourceType) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return LockServiceProtos.LockedResourceType.valueOf(resourceType.name());<a name="line.299"></a>
 <span class="sourceLineNo">300</span>  }<a name="line.300"></a>
 <span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public static LockServiceProtos.LockedResource convertToProtoLockedResource(<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      LockedResource lockedResource) throws IOException<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    LockServiceProtos.LockedResource.Builder builder =<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        LockServiceProtos.LockedResource.newBuilder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    builder<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        .setResourceType(convertToProtoResourceType(lockedResource.getResourceType()))<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        .setResourceName(lockedResource.getResourceName())<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        .setLockType(convertToProtoLockType(lockedResource.getLockType()));<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    Procedure&lt;?&gt; exclusiveLockOwnerProcedure = lockedResource.getExclusiveLockOwnerProcedure();<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>    if (exclusiveLockOwnerProcedure != null) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      ProcedureProtos.Procedure exclusiveLockOwnerProcedureProto =<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          convertToProtoProcedure(exclusiveLockOwnerProcedure);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      builder.setExclusiveLockOwnerProcedure(exclusiveLockOwnerProcedureProto);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    builder.setSharedLockCount(lockedResource.getSharedLockCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    for (Procedure&lt;?&gt; waitingProcedure : lockedResource.getWaitingProcedures()) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      ProcedureProtos.Procedure waitingProcedureProto =<a name="line.324"></a>
-<span class="sourceLineNo">325</span>          convertToProtoProcedure(waitingProcedure);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      builder.addWaitingProcedures(waitingProcedureProto);<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>    return builder.build();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>}<a name="line.331"></a>
+<span class="sourceLineNo">302</span>  public static LockServiceProtos.LockType convertToProtoLockType(LockType lockType) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    return LockServiceProtos.LockType.valueOf(lockType.name());<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>  public static LockServiceProtos.LockedResource convertToProtoLockedResource(<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      LockedResource lockedResource) throws IOException {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    LockServiceProtos.LockedResource.Builder builder =<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        LockServiceProtos.LockedResource.newBuilder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    builder<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        .setResourceType(convertToProtoResourceType(lockedResource.getResourceType()))<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        .setResourceName(lockedResource.getResourceName())<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        .setLockType(convertToProtoLockType(lockedResource.getLockType()));<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    Procedure&lt;?&gt; exclusiveLockOwnerProcedure = lockedResource.getExclusiveLockOwnerProcedure();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (exclusiveLockOwnerProcedure != null) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      ProcedureProtos.Procedure exclusiveLockOwnerProcedureProto =<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          convertToProtoProcedure(exclusiveLockOwnerProcedure);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      builder.setExclusiveLockOwnerProcedure(exclusiveLockOwnerProcedureProto);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>    builder.setSharedLockCount(lockedResource.getSharedLockCount());<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>    for (Procedure&lt;?&gt; waitingProcedure : lockedResource.getWaitingProcedures()) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      ProcedureProtos.Procedure waitingProcedureProto =<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          convertToProtoProcedure(waitingProcedure);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      builder.addWaitingProcedures(waitingProcedureProto);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    return builder.build();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * Get an exponential backoff time, in milliseconds. The base unit is 1 second, and the max<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * backoff time is 10 minutes. This is the general backoff policy for most procedure<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * implementation.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   */<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  public static long getBackoffTimeMs(int attempts) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    long maxBackoffTime = 10L * 60 * 1000; // Ten minutes, hard coded for now.<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    // avoid overflow<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    if (attempts &gt;= 30) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      return maxBackoffTime;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    return Math.min((long) (1000 * Math.pow(2, attempts)), maxBackoffTime);<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>
 
 
 


[09/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></

<TRUNCATED>

[23/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
index 0830c6b..20803d7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.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};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.43">ReopenTableRegionsProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.45">ReopenTableRegionsProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">AbstractStateMachineTableProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&gt;</pre>
 <div class="block">Used for reopening the regions for a table.</div>
 </li>
@@ -180,14 +180,18 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#attempt">attempt</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#regions">regions</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#tableName">tableName</a></span></code>&nbsp;</td>
 </tr>
@@ -296,6 +300,12 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
  persist (e.g.</div>
 </td>
 </tr>
+<tr id="i9" class="rowColor">
+<td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
+<div class="block">At end of timeout, wake ourselves up so we run again.</div>
+</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure">
@@ -316,7 +326,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#addStackIndex-int-">addStackIndex</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#afterReplay-TEnvironment-">afterReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#beforeReplay-TEnvironment-">beforeReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#compareTo-org.apache.hadoop.hbase.procedure2.Procedure-">compareTo</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#completionCleanup-TEnvironment-">completionCleanup</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doExecute-TEnvironment-">doExecute</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doRollback-TEnvironment-">doRollback</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#elapsedTime--">elapsedTime</a>, <a h
 ref="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getChildrenLatch--">getChildrenLatch</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getException--">getException</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getLastUpdate--">getLastUpdate</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getNonceKey--">getNonceKey</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getOwner--">getOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getParentProcId--">getParentProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcedureMetrics-TEnvironment-">getProcedureMetrics</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcId--">getProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcIdH
 ashCode-long-">getProcIdHashCode</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcName--">getProcName</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getResult--">getResult</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getRootProcedureId-java.util.Map-org.apache.hadoop.hbase.procedure2.Procedure-">getRootProcedureId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getRootProcId--">getRootProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getStackIndexes--">getStackIndexes</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getState--">getState</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getSubmittedTime--">getSubmittedTime</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getTimeout--">getTimeout</a>, <a hr
 ef="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getTimeoutTimestamp--">getTimeoutTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasChildren--">hasChildren</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasException--">hasException</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasLock--">hasLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasOwner--">hasOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasParent--">hasParent</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasTimeout--">hasTimeout</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#haveSameParent-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure-">haveSameParent</a>, <a href="../../../../../../org/apache
 /hadoop/hbase/procedure2/Procedure.html#holdLock-TEnvironment-">holdLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#incChildrenLatch--">incChildrenLatch</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isBypass--">isBypass</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isFailed--">isFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isFinished--">isFinished</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isInitializing--">isInitializing</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isRunnable--">isRunnable</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isSuccess--">isSuccess</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isWaiting--">isWaiting</a>, <a href="../../../../../../org/apache/hadoop/hbase/proc
 edure2/Procedure.html#removeStackIndex--">removeStackIndex</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setAbortFailure-java.lang.String-java.lang.String-">setAbortFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setChildrenLatch-int-">setChildrenLatch</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setFailure-org.apache.hadoop.hbase.procedure2.RemoteProcedureException-">setFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setFailure-java.lang.String-java.lang.Throwable-">setFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setLastUpdate-long-">setLastUpdate</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setNonceKey-org.apache.hadoop.hbase.util.NonceKey-">setNonceKey</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setOwner-jav
 a.lang.String-">setOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setOwner-org.apache.hadoop.hbase.security.User-">setOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setParentProcId-long-">setParentProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setProcId-long-">setProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setResult-byte:A-">setResult</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setRootProcId-long-">setRootProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setStackIndexes-java.util.List-">setStackIndexes</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setState-org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState-">setState</a>, <a href="../../../../../../org/apache/hadoop/hbase/proc
 edure2/Procedure.html#setSubmittedTime-long-">setSubmittedTime</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setTimeout-int-">setTimeout</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setTimeoutFailure-TEnvironment-">setTimeoutFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#shouldWaitClientAck-TEnvironment-">shouldWaitClientAck</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toString--">toString</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClass--">toStringClass</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringDetails--">toStringDetails</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringSimpleSB--">toStringSimpleSB</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#updateMetricsOnFinis
 h-TEnvironment-long-boolean-">updateMetricsOnFinish</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#updateMetricsOnSubmit-TEnvironment-">updateMetricsOnSubmit</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#updateTimestamp--">updateTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#wasExecuted--">wasExecuted</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#addStackIndex-int-">addStackIndex</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#afterReplay-TEnvironment-">afterReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#beforeReplay-TEnvironment-">beforeReplay</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#compareTo-org.apache.hadoop.hbase.procedure2.Procedure-">compareTo</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#completionCleanup-TEnvironment-">completionCleanup</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doExecute-TEnvironment-">doExecute</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#doRollback-TEnvironment-">doRollback</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#elapsedTime--">elapsedTime</a>, <a h
 ref="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getChildrenLatch--">getChildrenLatch</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getException--">getException</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getLastUpdate--">getLastUpdate</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getNonceKey--">getNonceKey</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getOwner--">getOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getParentProcId--">getParentProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcedureMetrics-TEnvironment-">getProcedureMetrics</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcId--">getProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcIdH
 ashCode-long-">getProcIdHashCode</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcName--">getProcName</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getResult--">getResult</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getRootProcedureId-java.util.Map-org.apache.hadoop.hbase.procedure2.Procedure-">getRootProcedureId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getRootProcId--">getRootProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getStackIndexes--">getStackIndexes</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getState--">getState</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getSubmittedTime--">getSubmittedTime</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getTimeout--">getTimeout</a>, <a hr
 ef="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getTimeoutTimestamp--">getTimeoutTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasChildren--">hasChildren</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasException--">hasException</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasLock--">hasLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasOwner--">hasOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasParent--">hasParent</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#hasTimeout--">hasTimeout</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#haveSameParent-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure-">haveSameParent</a>, <a href="../../../../../../org/apache
 /hadoop/hbase/procedure2/Procedure.html#holdLock-TEnvironment-">holdLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#incChildrenLatch--">incChildrenLatch</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isBypass--">isBypass</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isFailed--">isFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isFinished--">isFinished</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isInitializing--">isInitializing</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isRunnable--">isRunnable</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isSuccess--">isSuccess</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isWaiting--">isWaiting</a>, <a href="../../../../../../org/apache/hadoop/hbase/proc
 edure2/Procedure.html#removeStackIndex--">removeStackIndex</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setAbortFailure-java.lang.String-java.lang.String-">setAbortFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setChildrenLatch-int-">setChildrenLatch</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setFailure-org.apache.hadoop.hbase.procedure2.RemoteProcedureException-">setFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setFailure-java.lang.String-java.lang.Throwable-">setFailure</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setLastUpdate-long-">setLastUpdate</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setNonceKey-org.apache.hadoop.hbase.util.NonceKey-">setNonceKey</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setOwner-jav
 a.lang.String-">setOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setOwner-org.apache.hadoop.hbase.security.User-">setOwner</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setParentProcId-long-">setParentProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setProcId-long-">setProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setResult-byte:A-">setResult</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setRootProcId-long-">setRootProcId</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setStackIndexes-java.util.List-">setStackIndexes</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setState-org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState-">setState</a>, <a href="../../../../../../org/apache/hadoop/hbase/proc
 edure2/Procedure.html#setSubmittedTime-long-">setSubmittedTime</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setTimeout-int-">setTimeout</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#shouldWaitClientAck-TEnvironment-">shouldWaitClientAck</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toString--">toString</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClass--">toStringClass</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringDetails--">toStringDetails</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringSimpleSB--">toStringSimpleSB</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#updateMetricsOnFinish-TEnvironment-long-boolean-">updateMetricsOnFinish</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html
 #updateMetricsOnSubmit-TEnvironment-">updateMetricsOnSubmit</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#updateTimestamp--">updateTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#wasExecuted--">wasExecuted</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -345,7 +355,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.46">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.48">LOG</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -354,16 +364,25 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.48">tableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.50">tableName</a></pre>
 </li>
 </ul>
 <a name="regions">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>regions</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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.50">regions</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.52">regions</a></pre>
+</li>
+</ul>
+<a name="attempt">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>attempt</h4>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.54">attempt</a></pre>
 </li>
 </ul>
 </li>
@@ -380,7 +399,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>ReopenTableRegionsProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.52">ReopenTableRegionsProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.56">ReopenTableRegionsProcedure</a>()</pre>
 </li>
 </ul>
 <a name="ReopenTableRegionsProcedure-org.apache.hadoop.hbase.TableName-">
@@ -389,7 +408,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReopenTableRegionsProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.55">ReopenTableRegionsProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.59">ReopenTableRegionsProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 </li>
@@ -406,7 +425,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.60">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.64">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a></code></dd>
@@ -423,7 +442,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.65">getTableOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.69">getTableOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.
  e.g. if we get a delete and we have some table operation pending (e.g. add column)
@@ -444,7 +463,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.70">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.74">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;state)
                                                throws <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                       <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -465,13 +484,30 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </dl>
 </li>
 </ul>
+<a name="setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setTimeoutFailure</h4>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.135">setTimeoutFailure</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">At end of timeout, wake ourselves up so we run again.</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setTimeoutFailure-TEnvironment-">setTimeoutFailure</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt;</code></dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>true to let the framework handle the timeout as abort, false in case the procedure
+         handled the timeout itself.</dd>
+</dl>
+</li>
+</ul>
 <a name="rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.126">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.141">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;state)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                              <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>
@@ -493,7 +529,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.132">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.147">getState</a>(int&nbsp;stateId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getState-int-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 <dl>
@@ -512,7 +548,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.137">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.152">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getStateId-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 <dl>
@@ -531,7 +567,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.142">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.157">getInitialState</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getInitialState--">StateMachineProcedure</a></code></span></div>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 <dl>
@@ -548,7 +584,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.147">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.162">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
@@ -570,7 +606,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.156">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#line.171">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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
index 392b3ca..f4c4a29 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
@@ -1925,43 +1925,49 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
-<td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#shouldWaitClientAck-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">shouldWaitClientAck</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">ReopenTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
+<div class="block">At end of timeout, wake ourselves up so we run again.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
-<td class="colLast"><span class="typeNameLabel">CreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.html#shouldWaitClientAck-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">shouldWaitClientAck</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#shouldWaitClientAck-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">shouldWaitClientAck</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
-<td class="colLast"><span class="typeNameLabel">ServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html#shouldWaitClientAck-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">shouldWaitClientAck</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">CreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.html#shouldWaitClientAck-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">shouldWaitClientAck</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">ServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html#shouldWaitClientAck-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">shouldWaitClientAck</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">ServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html#splitLogs-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">splitLogs</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">ServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html#splitMetaLogs-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">splitMetaLogs</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteNamespaceProcedure.html#undoDeleteFromNSTable-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">undoDeleteFromNSTable</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">undo the delete</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteNamespaceProcedure.html#undoRemoveFromZKNamespaceManager-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">undoRemoveFromZKNamespaceManager</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">undo the remove from ZooKeeper</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#updateMETA-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateMETA</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Apply changes to hbase:meta</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">ModifyTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.html#updateReplicaColumnsIfNeeded-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-org.apache.hadoop.hbase.client.TableDescriptor-">updateReplicaColumnsIfNeeded</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                             <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;oldTableDescriptor,
@@ -1969,37 +1975,37 @@
 <div class="block">update replica column families if necessary.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#updateTableDescCache-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-">updateTableDescCache</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                     <a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#updateTableDescriptor-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateTableDescriptor</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Update descriptor</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">ModifyTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.html#updateTableDescriptor-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateTableDescriptor</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Update descriptor</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">ModifyNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyNamespaceProcedure.html#updateZKNamespaceManager-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateZKNamespaceManager</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Update ZooKeeper.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.html#updateZKNamespaceManager-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.NamespaceDescriptor-">updateZKNamespaceManager</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                         <a href="../../../../../../../org/apache/hadoop/hbase/NamespaceDescriptor.html" title="class in org.apache.hadoop.hbase">NamespaceDescriptor</a>&nbsp;nsDescriptor)</code>
 <div class="block">Update ZooKeeper.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static &lt;T&gt;&nbsp;T</code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureSyncWait.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.html#waitFor-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-long-long-java.lang.String-org.apache.hadoop.hbase.master.procedure.ProcedureSyncWait.Predicate-">waitFor</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
        long&nbsp;waitTime,
@@ -2007,37 +2013,37 @@
        <a href="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;purpose,
        <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.Predicate.html" title="interface in org.apache.hadoop.hbase.master.procedure">ProcedureSyncWait.Predicate</a>&lt;T&gt;&nbsp;predicate)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static &lt;T&gt;&nbsp;T</code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureSyncWait.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.html#waitFor-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-java.lang.String-org.apache.hadoop.hbase.master.procedure.ProcedureSyncWait.Predicate-">waitFor</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;purpose,
        <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.Predicate.html" title="interface in org.apache.hadoop.hbase.master.procedure">ProcedureSyncWait.Predicate</a>&lt;T&gt;&nbsp;predicate)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractStateMachineTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractStateMachineNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">InitMetaProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#waitInitialized-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitInitialized</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureSyncWait.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.html#waitMetaRegions-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">waitMetaRegions</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureSyncWait.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.html#waitRegionInTransition-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-java.util.List-">waitRegionInTransition</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 9bb6731..9238e86 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -437,18 +437,18 @@
 <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/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/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/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/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 </ul>
 </li>


[19/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
index 9c5a545..93bcb46 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html
@@ -35,140 +35,155 @@
 <span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.slf4j.Logger;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.LoggerFactory;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsStateData;<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>/**<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * Used for reopening the regions for a table.<a name="line.40"></a>
-<span class="sourceLineNo">041</span> */<a name="line.41"></a>
-<span class="sourceLineNo">042</span>@InterfaceAudience.Private<a name="line.42"></a>
-<span class="sourceLineNo">043</span>public class ReopenTableRegionsProcedure<a name="line.43"></a>
-<span class="sourceLineNo">044</span>    extends AbstractStateMachineTableProcedure&lt;ReopenTableRegionsState&gt; {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  private static final Logger LOG = LoggerFactory.getLogger(ReopenTableRegionsProcedure.class);<a name="line.46"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsState;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.ReopenTableRegionsStateData;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<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> * Used for reopening the regions for a table.<a name="line.42"></a>
+<span class="sourceLineNo">043</span> */<a name="line.43"></a>
+<span class="sourceLineNo">044</span>@InterfaceAudience.Private<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class ReopenTableRegionsProcedure<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    extends AbstractStateMachineTableProcedure&lt;ReopenTableRegionsState&gt; {<a name="line.46"></a>
 <span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private TableName tableName;<a name="line.48"></a>
+<span class="sourceLineNo">048</span>  private static final Logger LOG = LoggerFactory.getLogger(ReopenTableRegionsProcedure.class);<a name="line.48"></a>
 <span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private List&lt;HRegionLocation&gt; regions = Collections.emptyList();<a name="line.50"></a>
+<span class="sourceLineNo">050</span>  private TableName tableName;<a name="line.50"></a>
 <span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  public ReopenTableRegionsProcedure() {<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>  public ReopenTableRegionsProcedure(TableName tableName) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    this.tableName = tableName;<a name="line.56"></a>
+<span class="sourceLineNo">052</span>  private List&lt;HRegionLocation&gt; regions = Collections.emptyList();<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private int attempt;<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>  public ReopenTableRegionsProcedure() {<a name="line.56"></a>
 <span class="sourceLineNo">057</span>  }<a name="line.57"></a>
 <span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  @Override<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  public TableName getTableName() {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    return tableName;<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>  @Override<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  public TableOperationType getTableOperationType() {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    return TableOperationType.REGION_EDIT;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  @Override<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  protected Flow executeFromState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.70"></a>
-<span class="sourceLineNo">071</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    switch (state) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>      case REOPEN_TABLE_REGIONS_GET_REGIONS:<a name="line.73"></a>
-<span class="sourceLineNo">074</span>        if (!env.getAssignmentManager().isTableEnabled(tableName)) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>          LOG.info("Table {} is disabled, give up reopening its regions");<a name="line.75"></a>
-<span class="sourceLineNo">076</span>          return Flow.NO_MORE_STATE;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>        }<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        regions =<a name="line.78"></a>
-<span class="sourceLineNo">079</span>          env.getAssignmentManager().getRegionStates().getRegionsOfTableForReopen(tableName);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        return Flow.HAS_MORE_STATE;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      case REOPEN_TABLE_REGIONS_REOPEN_REGIONS:<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        for (HRegionLocation loc : regions) {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>          RegionStateNode regionNode = env.getAssignmentManager().getRegionStates()<a name="line.84"></a>
-<span class="sourceLineNo">085</span>            .getOrCreateRegionStateNode(loc.getRegion());<a name="line.85"></a>
-<span class="sourceLineNo">086</span>          TransitRegionStateProcedure proc;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>          regionNode.lock();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>          try {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>            if (regionNode.getProcedure() != null) {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>              continue;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>            }<a name="line.91"></a>
-<span class="sourceLineNo">092</span>            proc = TransitRegionStateProcedure.reopen(env, regionNode.getRegionInfo());<a name="line.92"></a>
-<span class="sourceLineNo">093</span>            regionNode.setProcedure(proc);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>          } finally {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>            regionNode.unlock();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>          }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>          addChildProcedure(proc);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>        }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_CONFIRM_REOPENED);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        return Flow.HAS_MORE_STATE;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      case REOPEN_TABLE_REGIONS_CONFIRM_REOPENED:<a name="line.101"></a>
-<span class="sourceLineNo">102</span>        regions = regions.stream().map(env.getAssignmentManager().getRegionStates()::checkReopened)<a name="line.102"></a>
-<span class="sourceLineNo">103</span>          .filter(l -&gt; l != null).collect(Collectors.toList());<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        if (regions.isEmpty()) {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>          return Flow.NO_MORE_STATE;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>        if (regions.stream().anyMatch(l -&gt; l.getSeqNum() &gt;= 0)) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>          setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>          return Flow.HAS_MORE_STATE;<a name="line.109"></a>
+<span class="sourceLineNo">059</span>  public ReopenTableRegionsProcedure(TableName tableName) {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    this.tableName = tableName;<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 TableName getTableName() {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    return tableName;<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 TableOperationType getTableOperationType() {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    return TableOperationType.REGION_EDIT;<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>  protected Flow executeFromState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    switch (state) {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      case REOPEN_TABLE_REGIONS_GET_REGIONS:<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        if (!env.getAssignmentManager().isTableEnabled(tableName)) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>          LOG.info("Table {} is disabled, give up reopening its regions");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>          return Flow.NO_MORE_STATE;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        }<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        regions =<a name="line.82"></a>
+<span class="sourceLineNo">083</span>          env.getAssignmentManager().getRegionStates().getRegionsOfTableForReopen(tableName);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>        return Flow.HAS_MORE_STATE;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      case REOPEN_TABLE_REGIONS_REOPEN_REGIONS:<a name="line.86"></a>
+<span class="sourceLineNo">087</span>        for (HRegionLocation loc : regions) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>          RegionStateNode regionNode = env.getAssignmentManager().getRegionStates()<a name="line.88"></a>
+<span class="sourceLineNo">089</span>            .getOrCreateRegionStateNode(loc.getRegion());<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          TransitRegionStateProcedure proc;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>          regionNode.lock();<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          try {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>            if (regionNode.getProcedure() != null) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>              continue;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>            }<a name="line.95"></a>
+<span class="sourceLineNo">096</span>            proc = TransitRegionStateProcedure.reopen(env, regionNode.getRegionInfo());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>            regionNode.setProcedure(proc);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>          } finally {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>            regionNode.unlock();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>          }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>          addChildProcedure(proc);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        }<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_CONFIRM_REOPENED);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        return Flow.HAS_MORE_STATE;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      case REOPEN_TABLE_REGIONS_CONFIRM_REOPENED:<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        regions = regions.stream().map(env.getAssignmentManager().getRegionStates()::checkReopened)<a name="line.106"></a>
+<span class="sourceLineNo">107</span>          .filter(l -&gt; l != null).collect(Collectors.toList());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        if (regions.isEmpty()) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>          return Flow.NO_MORE_STATE;<a name="line.109"></a>
 <span class="sourceLineNo">110</span>        }<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        LOG.info("There are still {} region(s) which need to be reopened for table {} are in " +<a name="line.111"></a>
-<span class="sourceLineNo">112</span>          "OPENING state, try again later", regions.size(), tableName);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        // All the regions need to reopen are in OPENING state which means we can not schedule any<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        // MRPs. Then sleep for one second, and yield the procedure to let other procedures run<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        // first and hope next time we can get some regions in other state to make progress.<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        // TODO: add a delay for ProcedureYieldException so that we do not need to sleep here which<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        // blocks a procedure worker.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        Thread.sleep(1000);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        throw new ProcedureYieldException();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      default:<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected void rollbackState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      throws IOException, InterruptedException {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.128"></a>
+<span class="sourceLineNo">111</span>        if (regions.stream().anyMatch(l -&gt; l.getSeqNum() &gt;= 0)) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>          attempt = 0;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          setNextState(ReopenTableRegionsState.REOPEN_TABLE_REGIONS_REOPEN_REGIONS);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>          return Flow.HAS_MORE_STATE;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        // All the regions need to reopen are in OPENING state which means we can not schedule any<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        // MRPs.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        long backoff = ProcedureUtil.getBackoffTimeMs(this.attempt++);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        LOG.info(<a name="line.119"></a>
+<span class="sourceLineNo">120</span>          "There are still {} region(s) which need to be reopened for table {} are in " +<a name="line.120"></a>
+<span class="sourceLineNo">121</span>            "OPENING state, suspend {}secs and try again later",<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          regions.size(), tableName, backoff / 1000);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        setTimeout(Math.toIntExact(backoff));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        throw new ProcedureSuspendedException();<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      default:<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span>  }<a name="line.129"></a>
 <span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  @Override<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  protected ReopenTableRegionsState getState(int stateId) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    return ReopenTableRegionsState.forNumber(stateId);<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>  protected int getStateId(ReopenTableRegionsState state) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    return state.getNumber();<a name="line.138"></a>
+<span class="sourceLineNo">131</span>  /**<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  @Override<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    env.getProcedureScheduler().addFront(this);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    return false; // 'false' means that this procedure handled the timeout<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>  protected ReopenTableRegionsState getInitialState() {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    return ReopenTableRegionsState.REOPEN_TABLE_REGIONS_GET_REGIONS;<a name="line.143"></a>
+<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  protected void rollbackState(MasterProcedureEnv env, ReopenTableRegionsState state)<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      throws IOException, InterruptedException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    throw new UnsupportedOperationException("unhandled state=" + state);<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>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    super.serializeStateData(serializer);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ReopenTableRegionsStateData.Builder builder = ReopenTableRegionsStateData.newBuilder()<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      .setTableName(ProtobufUtil.toProtoTableName(tableName));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    regions.stream().map(ProtobufUtil::toRegionLocation).forEachOrdered(builder::addRegion);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    serializer.serialize(builder.build());<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    super.deserializeStateData(serializer);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    ReopenTableRegionsStateData data = serializer.deserialize(ReopenTableRegionsStateData.class);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    tableName = ProtobufUtil.toTableName(data.getTableName());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    regions = data.getRegionList().stream().map(ProtobufUtil::toRegionLocation)<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      .collect(Collectors.toList());<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span>}<a name="line.163"></a>
+<span class="sourceLineNo">147</span>  protected ReopenTableRegionsState getState(int stateId) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    return ReopenTableRegionsState.forNumber(stateId);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @Override<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  protected int getStateId(ReopenTableRegionsState state) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    return state.getNumber();<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>  protected ReopenTableRegionsState getInitialState() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    return ReopenTableRegionsState.REOPEN_TABLE_REGIONS_GET_REGIONS;<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>  @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    super.serializeStateData(serializer);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    ReopenTableRegionsStateData.Builder builder = ReopenTableRegionsStateData.newBuilder()<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      .setTableName(ProtobufUtil.toProtoTableName(tableName));<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    regions.stream().map(ProtobufUtil::toRegionLocation).forEachOrdered(builder::addRegion);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    serializer.serialize(builder.build());<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>  @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    super.deserializeStateData(serializer);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    ReopenTableRegionsStateData data = serializer.deserialize(ReopenTableRegionsStateData.class);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    tableName = ProtobufUtil.toTableName(data.getTableName());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    regions = data.getRegionList().stream().map(ProtobufUtil::toRegionLocation)<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      .collect(Collectors.toList());<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.LockState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.LockState.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.LockState.html
index c081310..c7f1e58 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.LockState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.LockState.html
@@ -774,280 +774,287 @@
 <span class="sourceLineNo">766</span><a name="line.766"></a>
 <span class="sourceLineNo">767</span>  /**<a name="line.767"></a>
 <span class="sourceLineNo">768</span>   * Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * @return true to let the framework handle the timeout as abort, false in case the procedure<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   *         handled the timeout itself.<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  protected synchronized boolean setTimeoutFailure(TEnvironment env) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    if (state == ProcedureState.WAITING_TIMEOUT) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      long timeDiff = EnvironmentEdgeManager.currentTime() - lastUpdate;<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      setFailure("ProcedureExecutor", new TimeoutIOException(<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        "Operation timed out after " + StringUtils.humanTimeDiff(timeDiff)));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      return true;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    return false;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
-<span class="sourceLineNo">781</span><a name="line.781"></a>
-<span class="sourceLineNo">782</span>  public synchronized boolean hasException() {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    return exception != null;<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public synchronized RemoteProcedureException getException() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return exception;<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>  /**<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  protected synchronized void setChildrenLatch(int numChildren) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.childrenLatch = numChildren;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (LOG.isTraceEnabled()) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      LOG.trace("CHILD LATCH INCREMENT SET " +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          this.childrenLatch, new Throwable(this.toString()));<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    }<a name="line.798"></a>
-<span class="sourceLineNo">799</span>  }<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>  /**<a name="line.801"></a>
-<span class="sourceLineNo">802</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.802"></a>
-<span class="sourceLineNo">803</span>   */<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  protected synchronized void incChildrenLatch() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    // TODO: can this be inferred from the stack? I think so...<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    this.childrenLatch++;<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    if (LOG.isTraceEnabled()) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>      LOG.trace("CHILD LATCH INCREMENT " + this.childrenLatch, new Throwable(this.toString()));<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  /**<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   * Called by the ProcedureExecutor to notify that one of the sub-procedures has completed.<a name="line.813"></a>
-<span class="sourceLineNo">814</span>   */<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  private synchronized boolean childrenCountDown() {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    assert childrenLatch &gt; 0: this;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    boolean b = --childrenLatch == 0;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    if (LOG.isTraceEnabled()) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      LOG.trace("CHILD LATCH DECREMENT " + childrenLatch, new Throwable(this.toString()));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    return b;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
-<span class="sourceLineNo">823</span><a name="line.823"></a>
-<span class="sourceLineNo">824</span>  /**<a name="line.824"></a>
-<span class="sourceLineNo">825</span>   * Try to set this procedure into RUNNABLE state.<a name="line.825"></a>
-<span class="sourceLineNo">826</span>   * Succeeds if all subprocedures/children are done.<a name="line.826"></a>
-<span class="sourceLineNo">827</span>   * @return True if we were able to move procedure to RUNNABLE state.<a name="line.827"></a>
-<span class="sourceLineNo">828</span>   */<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  synchronized boolean tryRunnable() {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    // Don't use isWaiting in the below; it returns true for WAITING and WAITING_TIMEOUT<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    if (getState() == ProcedureState.WAITING &amp;&amp; childrenCountDown()) {<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      setState(ProcedureState.RUNNABLE);<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      return true;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    } else {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      return false;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>  protected synchronized boolean hasChildren() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    return childrenLatch &gt; 0;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>  }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>  protected synchronized int getChildrenLatch() {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    return childrenLatch;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>  /**<a name="line.847"></a>
-<span class="sourceLineNo">848</span>   * Called by the RootProcedureState on procedure execution.<a name="line.848"></a>
-<span class="sourceLineNo">849</span>   * Each procedure store its stack-index positions.<a name="line.849"></a>
-<span class="sourceLineNo">850</span>   */<a name="line.850"></a>
-<span class="sourceLineNo">851</span>  protected synchronized void addStackIndex(final int index) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    if (stackIndexes == null) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      stackIndexes = new int[] { index };<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    } else {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      int count = stackIndexes.length;<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      stackIndexes = Arrays.copyOf(stackIndexes, count + 1);<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      stackIndexes[count] = index;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    }<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  }<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>  protected synchronized boolean removeStackIndex() {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (stackIndexes != null &amp;&amp; stackIndexes.length &gt; 1) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      stackIndexes = Arrays.copyOf(stackIndexes, stackIndexes.length - 1);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return false;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    } else {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      stackIndexes = null;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      return true;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * Called on store load to initialize the Procedure internals after<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * the creation/deserialization.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   */<a name="line.874"></a>
-<span class="sourceLineNo">875</span>  protected synchronized void setStackIndexes(final List&lt;Integer&gt; stackIndexes) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    this.stackIndexes = new int[stackIndexes.size()];<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    for (int i = 0; i &lt; this.stackIndexes.length; ++i) {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      this.stackIndexes[i] = stackIndexes.get(i);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>  protected synchronized boolean wasExecuted() {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    return stackIndexes != null;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>  }<a name="line.884"></a>
-<span class="sourceLineNo">885</span><a name="line.885"></a>
-<span class="sourceLineNo">886</span>  protected synchronized int[] getStackIndexes() {<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    return stackIndexes;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>  // ==========================================================================<a name="line.890"></a>
-<span class="sourceLineNo">891</span>  //  Internal methods - called by the ProcedureExecutor<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  // ==========================================================================<a name="line.892"></a>
-<span class="sourceLineNo">893</span><a name="line.893"></a>
-<span class="sourceLineNo">894</span>  /**<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   * Internal method called by the ProcedureExecutor that starts the user-level code execute().<a name="line.895"></a>
-<span class="sourceLineNo">896</span>   * @throws ProcedureSuspendedException This is used when procedure wants to halt processing and<a name="line.896"></a>
-<span class="sourceLineNo">897</span>   *           skip out without changing states or releasing any locks held.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>   */<a name="line.898"></a>
-<span class="sourceLineNo">899</span>  protected Procedure&lt;TEnvironment&gt;[] doExecute(TEnvironment env)<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>    try {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      updateTimestamp();<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      if (bypass) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        LOG.info("{} bypassed, returning null to finish it", this);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        return null;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      return execute(env);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    } finally {<a name="line.908"></a>
+<span class="sourceLineNo">769</span>   * &lt;p/&gt;<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * Another usage for this method is to implement retrying. A procedure can set the state to<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   * {@code WAITING_TIMEOUT} by calling {@code setState} method, and throw a<a name="line.771"></a>
+<span class="sourceLineNo">772</span>   * {@link ProcedureSuspendedException} to halt the execution of the procedure, and do not forget a<a name="line.772"></a>
+<span class="sourceLineNo">773</span>   * call {@link #setTimeout(int)} method to set the timeout. And you should also override this<a name="line.773"></a>
+<span class="sourceLineNo">774</span>   * method to wake up the procedure, and also return false to tell the ProcedureExecutor that the<a name="line.774"></a>
+<span class="sourceLineNo">775</span>   * timeout event has been handled.<a name="line.775"></a>
+<span class="sourceLineNo">776</span>   * @return true to let the framework handle the timeout as abort, false in case the procedure<a name="line.776"></a>
+<span class="sourceLineNo">777</span>   *         handled the timeout itself.<a name="line.777"></a>
+<span class="sourceLineNo">778</span>   */<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  protected synchronized boolean setTimeoutFailure(TEnvironment env) {<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    if (state == ProcedureState.WAITING_TIMEOUT) {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>      long timeDiff = EnvironmentEdgeManager.currentTime() - lastUpdate;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      setFailure("ProcedureExecutor",<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        new TimeoutIOException("Operation timed out after " + StringUtils.humanTimeDiff(timeDiff)));<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      return true;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return false;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>  }<a name="line.787"></a>
+<span class="sourceLineNo">788</span><a name="line.788"></a>
+<span class="sourceLineNo">789</span>  public synchronized boolean hasException() {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    return exception != null;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
+<span class="sourceLineNo">792</span><a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public synchronized RemoteProcedureException getException() {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    return exception;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
+<span class="sourceLineNo">798</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.798"></a>
+<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  protected synchronized void setChildrenLatch(int numChildren) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    this.childrenLatch = numChildren;<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    if (LOG.isTraceEnabled()) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      LOG.trace("CHILD LATCH INCREMENT SET " +<a name="line.803"></a>
+<span class="sourceLineNo">804</span>          this.childrenLatch, new Throwable(this.toString()));<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
+<span class="sourceLineNo">807</span><a name="line.807"></a>
+<span class="sourceLineNo">808</span>  /**<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   */<a name="line.810"></a>
+<span class="sourceLineNo">811</span>  protected synchronized void incChildrenLatch() {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    // TODO: can this be inferred from the stack? I think so...<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    this.childrenLatch++;<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    if (LOG.isTraceEnabled()) {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      LOG.trace("CHILD LATCH INCREMENT " + this.childrenLatch, new Throwable(this.toString()));<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  /**<a name="line.819"></a>
+<span class="sourceLineNo">820</span>   * Called by the ProcedureExecutor to notify that one of the sub-procedures has completed.<a name="line.820"></a>
+<span class="sourceLineNo">821</span>   */<a name="line.821"></a>
+<span class="sourceLineNo">822</span>  private synchronized boolean childrenCountDown() {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    assert childrenLatch &gt; 0: this;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    boolean b = --childrenLatch == 0;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>    if (LOG.isTraceEnabled()) {<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      LOG.trace("CHILD LATCH DECREMENT " + childrenLatch, new Throwable(this.toString()));<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    return b;<a name="line.828"></a>
+<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Try to set this procedure into RUNNABLE state.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * Succeeds if all subprocedures/children are done.<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   * @return True if we were able to move procedure to RUNNABLE state.<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   */<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  synchronized boolean tryRunnable() {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    // Don't use isWaiting in the below; it returns true for WAITING and WAITING_TIMEOUT<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    if (getState() == ProcedureState.WAITING &amp;&amp; childrenCountDown()) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>      setState(ProcedureState.RUNNABLE);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      return true;<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    } else {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      return false;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  }<a name="line.844"></a>
+<span class="sourceLineNo">845</span><a name="line.845"></a>
+<span class="sourceLineNo">846</span>  protected synchronized boolean hasChildren() {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return childrenLatch &gt; 0;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  protected synchronized int getChildrenLatch() {<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    return childrenLatch;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>  }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>  /**<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * Called by the RootProcedureState on procedure execution.<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * Each procedure store its stack-index positions.<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   */<a name="line.857"></a>
+<span class="sourceLineNo">858</span>  protected synchronized void addStackIndex(final int index) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    if (stackIndexes == null) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      stackIndexes = new int[] { index };<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>      int count = stackIndexes.length;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      stackIndexes = Arrays.copyOf(stackIndexes, count + 1);<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      stackIndexes[count] = index;<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    }<a name="line.865"></a>
+<span class="sourceLineNo">866</span>  }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>  protected synchronized boolean removeStackIndex() {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>    if (stackIndexes != null &amp;&amp; stackIndexes.length &gt; 1) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      stackIndexes = Arrays.copyOf(stackIndexes, stackIndexes.length - 1);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      return false;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    } else {<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      stackIndexes = null;<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      return true;<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>  }<a name="line.876"></a>
+<span class="sourceLineNo">877</span><a name="line.877"></a>
+<span class="sourceLineNo">878</span>  /**<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * Called on store load to initialize the Procedure internals after<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * the creation/deserialization.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  protected synchronized void setStackIndexes(final List&lt;Integer&gt; stackIndexes) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    this.stackIndexes = new int[stackIndexes.size()];<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    for (int i = 0; i &lt; this.stackIndexes.length; ++i) {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      this.stackIndexes[i] = stackIndexes.get(i);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span>  }<a name="line.887"></a>
+<span class="sourceLineNo">888</span><a name="line.888"></a>
+<span class="sourceLineNo">889</span>  protected synchronized boolean wasExecuted() {<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    return stackIndexes != null;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>  }<a name="line.891"></a>
+<span class="sourceLineNo">892</span><a name="line.892"></a>
+<span class="sourceLineNo">893</span>  protected synchronized int[] getStackIndexes() {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    return stackIndexes;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>  }<a name="line.895"></a>
+<span class="sourceLineNo">896</span><a name="line.896"></a>
+<span class="sourceLineNo">897</span>  // ==========================================================================<a name="line.897"></a>
+<span class="sourceLineNo">898</span>  //  Internal methods - called by the ProcedureExecutor<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  // ==========================================================================<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Internal method called by the ProcedureExecutor that starts the user-level code execute().<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @throws ProcedureSuspendedException This is used when procedure wants to halt processing and<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   *           skip out without changing states or releasing any locks held.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>   */<a name="line.905"></a>
+<span class="sourceLineNo">906</span>  protected Procedure&lt;TEnvironment&gt;[] doExecute(TEnvironment env)<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    try {<a name="line.908"></a>
 <span class="sourceLineNo">909</span>      updateTimestamp();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  }<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   * Internal method called by the ProcedureExecutor that starts the user-level code rollback().<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   */<a name="line.915"></a>
-<span class="sourceLineNo">916</span>  protected void doRollback(TEnvironment env)<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      throws IOException, InterruptedException {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    try {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      updateTimestamp();<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      if (bypass) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        LOG.info("{} bypassed, skipping rollback", this);<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        return;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      rollback(env);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    } finally {<a name="line.925"></a>
+<span class="sourceLineNo">910</span>      if (bypass) {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>        LOG.info("{} bypassed, returning null to finish it", this);<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        return null;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      return execute(env);<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    } finally {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      updateTimestamp();<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>  }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>  /**<a name="line.920"></a>
+<span class="sourceLineNo">921</span>   * Internal method called by the ProcedureExecutor that starts the user-level code rollback().<a name="line.921"></a>
+<span class="sourceLineNo">922</span>   */<a name="line.922"></a>
+<span class="sourceLineNo">923</span>  protected void doRollback(TEnvironment env)<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      throws IOException, InterruptedException {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    try {<a name="line.925"></a>
 <span class="sourceLineNo">926</span>      updateTimestamp();<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>  }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>  final void restoreLock(TEnvironment env) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    if (!lockedWhenLoading) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      LOG.debug("{} didn't hold the lock before restarting, skip acquiring lock.", this);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return;<a name="line.933"></a>
+<span class="sourceLineNo">927</span>      if (bypass) {<a name="line.927"></a>
+<span class="sourceLineNo">928</span>        LOG.info("{} bypassed, skipping rollback", this);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        return;<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      rollback(env);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    } finally {<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      updateTimestamp();<a name="line.933"></a>
 <span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    if (isFinished()) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      LOG.debug("{} is already finished, skip acquiring lock.", this);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      return;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    }<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>    if (isBypass()) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.debug("{} is already bypassed, skip acquiring lock.", this);<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      return;<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    LOG.debug("{} held the lock before restarting, call acquireLock to restore it.", this);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    LockState state = acquireLock(env);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    assert state == LockState.LOCK_ACQUIRED;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>  }<a name="line.949"></a>
-<span class="sourceLineNo">950</span><a name="line.950"></a>
-<span class="sourceLineNo">951</span>  /**<a name="line.951"></a>
-<span class="sourceLineNo">952</span>   * Internal method called by the ProcedureExecutor that starts the user-level code acquireLock().<a name="line.952"></a>
-<span class="sourceLineNo">953</span>   */<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  final LockState doAcquireLock(TEnvironment env, ProcedureStore store) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    if (waitInitialized(env)) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    if (lockedWhenLoading) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      // reset it so we will not consider it anymore<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      lockedWhenLoading = false;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      locked = true;<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      // Here we return without persist the locked state, as lockedWhenLoading is true means<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      // that the locked field of the procedure stored in procedure store is true, so we do not need<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      // to store it again.<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return LockState.LOCK_ACQUIRED;<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    LockState state = acquireLock(env);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    if (state == LockState.LOCK_ACQUIRED) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      locked = true;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // persist that we have held the lock. This must be done before we actually execute the<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // procedure, otherwise when restarting, we may consider the procedure does not have a lock,<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // but it may have already done some changes as we have already executed it, and if another<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // procedure gets the lock, then the semantic will be broken if the holdLock is true, as we do<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      // not expect that another procedure can be executed in the middle.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      store.update(this);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>    return state;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>  }<a name="line.978"></a>
-<span class="sourceLineNo">979</span><a name="line.979"></a>
-<span class="sourceLineNo">980</span>  /**<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * Internal method called by the ProcedureExecutor that starts the user-level code releaseLock().<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  final void doReleaseLock(TEnvironment env, ProcedureStore store) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    locked = false;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    // persist that we have released the lock. This must be done before we actually release the<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // lock. Another procedure may take this lock immediately after we release the lock, and if we<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    // crash before persist the information that we have already released the lock, then when<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    // restarting there will be two procedures which both have the lock and cause problems.<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    if (getState() != ProcedureState.ROLLEDBACK) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // If the state is ROLLEDBACK, it means that we have already deleted the procedure from<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      // procedure store, so do not need to log the release operation any more.<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      store.update(this);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    releaseLock(env);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public int compareTo(final Procedure&lt;TEnvironment&gt; other) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    return Long.compare(getProcId(), other.getProcId());<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  //  misc utils<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  // ==========================================================================<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  /**<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>   * Get an hashcode for the specified Procedure ID<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>   * @return the hashcode for the specified procId<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   */<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public static long getProcIdHashCode(long procId) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    long h = procId;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    h ^= h &gt;&gt; 16;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    h *= 0x85ebca6b;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    h ^= h &gt;&gt; 13;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    h *= 0xc2b2ae35;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    h ^= h &gt;&gt; 16;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    return h;<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * Helper to lookup the root Procedure ID given a specified procedure.<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   */<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  protected static &lt;T&gt; Long getRootProcedureId(Map&lt;Long, Procedure&lt;T&gt;&gt; procedures,<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      Procedure&lt;T&gt; proc) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    while (proc.hasParent()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      proc = procedures.get(proc.getParentProcId());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (proc == null) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        return null;<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      }<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    return proc.getProcId();<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>  }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>  /**<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param a the first procedure to be compared.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   * @param b the second procedure to be compared.<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   * @return true if the two procedures have the same parent<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   */<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>  public static boolean haveSameParent(Procedure&lt;?&gt; a, Procedure&lt;?&gt; b) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    return a.hasParent() &amp;&amp; b.hasParent() &amp;&amp; (a.getParentProcId() == b.getParentProcId());<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>  }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>}<a name="line.1042"></a>
+<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
+<span class="sourceLineNo">936</span><a name="line.936"></a>
+<span class="sourceLineNo">937</span>  final void restoreLock(TEnvironment env) {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    if (!lockedWhenLoading) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      LOG.debug("{} didn't hold the lock before restarting, skip acquiring lock.", this);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>      return;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    if (isFinished()) {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      LOG.debug("{} is already finished, skip acquiring lock.", this);<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      return;<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    if (isBypass()) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      LOG.debug("{} is already bypassed, skip acquiring lock.", this);<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      return;<a name="line.950"></a>
+<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>    LOG.debug("{} held the lock before restarting, call acquireLock to restore it.", this);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    LockState state = acquireLock(env);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    assert state == LockState.LOCK_ACQUIRED;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
+<span class="sourceLineNo">957</span><a name="line.957"></a>
+<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
+<span class="sourceLineNo">959</span>   * Internal method called by the ProcedureExecutor that starts the user-level code acquireLock().<a name="line.959"></a>
+<span class="sourceLineNo">960</span>   */<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  final LockState doAcquireLock(TEnvironment env, ProcedureStore store) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    if (waitInitialized(env)) {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    if (lockedWhenLoading) {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      // reset it so we will not consider it anymore<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      lockedWhenLoading = false;<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      locked = true;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      // Here we return without persist the locked state, as lockedWhenLoading is true means<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      // that the locked field of the procedure stored in procedure store is true, so we do not need<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // to store it again.<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      return LockState.LOCK_ACQUIRED;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>    LockState state = acquireLock(env);<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    if (state == LockState.LOCK_ACQUIRED) {<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      locked = true;<a name="line.976"></a>
+<span class="sourceLineNo">977</span>      // persist that we have held the lock. This must be done before we actually execute the<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      // procedure, otherwise when restarting, we may consider the procedure does not have a lock,<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      // but it may have already done some changes as we have already executed it, and if another<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      // procedure gets the lock, then the semantic will be broken if the holdLock is true, as we do<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      // not expect that another procedure can be executed in the middle.<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      store.update(this);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span>    return state;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>  }<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>  /**<a name="line.987"></a>
+<span class="sourceLineNo">988</span>   * Internal method called by the ProcedureExecutor that starts the user-level code releaseLock().<a name="line.988"></a>
+<span class="sourceLineNo">989</span>   */<a name="line.989"></a>
+<span class="sourceLineNo">990</span>  final void doReleaseLock(TEnvironment env, ProcedureStore store) {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    locked = false;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    // persist that we have released the lock. This must be done before we actually release the<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    // lock. Another procedure may take this lock immediately after we release the lock, and if we<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    // crash before persist the information that we have already released the lock, then when<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    // restarting there will be two procedures which both have the lock and cause problems.<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    if (getState() != ProcedureState.ROLLEDBACK) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      // If the state is ROLLEDBACK, it means that we have already deleted the procedure from<a name="line.997"></a>
+<span class="sourceLineNo">998</span>      // procedure store, so do not need to log the release operation any more.<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      store.update(this);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    releaseLock(env);<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  }<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span><a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>  @Override<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  public int compareTo(final Procedure&lt;TEnvironment&gt; other) {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    return Long.compare(getProcId(), other.getProcId());<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>  // ==========================================================================<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>  //  misc utils<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>  // ==========================================================================<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>  /**<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>   * Get an hashcode for the specified Procedure ID<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>   * @return the hashcode for the specified procId<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>   */<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>  public static long getProcIdHashCode(long procId) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    long h = procId;<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    h ^= h &gt;&gt; 16;<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>    h *= 0x85ebca6b;<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>    h ^= h &gt;&gt; 13;<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    h *= 0xc2b2ae35;<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    h ^= h &gt;&gt; 16;<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    return h;<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  /**<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>   * Helper to lookup the root Procedure ID given a specified procedure.<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>   */<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>  protected static &lt;T&gt; Long getRootProcedureId(Map&lt;Long, Procedure&lt;T&gt;&gt; procedures,<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      Procedure&lt;T&gt; proc) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    while (proc.hasParent()) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      proc = procedures.get(proc.getParentProcId());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      if (proc == null) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    return proc.getProcId();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>  /**<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>   * @param a the first procedure to be compared.<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>   * @param b the second procedure to be compared.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>   * @return true if the two procedures have the same parent<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   */<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>  public static boolean haveSameParent(Procedure&lt;?&gt; a, Procedure&lt;?&gt; b) {<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    return a.hasParent() &amp;&amp; b.hasParent() &amp;&amp; (a.getParentProcId() == b.getParentProcId());<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>}<a name="line.1049"></a>
 
 
 


[15/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
index 76e3c88..0d97a1c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
@@ -52,291 +52,308 @@
 <span class="sourceLineNo">044</span>  // ==========================================================================<a name="line.44"></a>
 <span class="sourceLineNo">045</span>  //  Reflection helpers to create/validate a Procedure object<a name="line.45"></a>
 <span class="sourceLineNo">046</span>  // ==========================================================================<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public static Procedure newProcedure(final String className) throws BadProcedureException {<a name="line.47"></a>
+<span class="sourceLineNo">047</span>  private static Procedure&lt;?&gt; newProcedure(String className) throws BadProcedureException {<a name="line.47"></a>
 <span class="sourceLineNo">048</span>    try {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      final Class&lt;?&gt; clazz = Class.forName(className);<a name="line.49"></a>
+<span class="sourceLineNo">049</span>      Class&lt;?&gt; clazz = Class.forName(className);<a name="line.49"></a>
 <span class="sourceLineNo">050</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.50"></a>
 <span class="sourceLineNo">051</span>        throw new Exception("the " + clazz + " class is not public");<a name="line.51"></a>
 <span class="sourceLineNo">052</span>      }<a name="line.52"></a>
 <span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>      final Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      assert ctor != null : "no constructor found";<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.56"></a>
-<span class="sourceLineNo">057</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.57"></a>
-<span class="sourceLineNo">058</span>      }<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      return (Procedure)ctor.newInstance();<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    } catch (Exception e) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      throw new BadProcedureException("The procedure class " + className +<a name="line.61"></a>
-<span class="sourceLineNo">062</span>          " must be accessible and have an empty constructor", e);<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    }<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public static void validateClass(final Procedure proc) throws BadProcedureException {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    try {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      final Class&lt;?&gt; clazz = proc.getClass();<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>        throw new Exception("the " + clazz + " class is not public");<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>      final Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      assert ctor != null;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    } catch (Exception e) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      throw new BadProcedureException("The procedure class " + proc.getClass().getName() +<a name="line.79"></a>
-<span class="sourceLineNo">080</span>          " must be accessible and have an empty constructor", e);<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><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // ==========================================================================<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //  convert to and from Procedure object<a name="line.85"></a>
+<span class="sourceLineNo">054</span>      @SuppressWarnings("rawtypes")<a name="line.54"></a>
+<span class="sourceLineNo">055</span>      Constructor&lt;? extends Procedure&gt; ctor = clazz.asSubclass(Procedure.class).getConstructor();<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      assert ctor != null : "no constructor found";<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      }<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      return ctor.newInstance();<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    } catch (Exception e) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      throw new BadProcedureException(<a name="line.62"></a>
+<span class="sourceLineNo">063</span>        "The procedure class " + className + " must be accessible and have an empty constructor",<a name="line.63"></a>
+<span class="sourceLineNo">064</span>        e);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    }<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>  static void validateClass(Procedure&lt;?&gt; proc) throws BadProcedureException {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    try {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      Class&lt;?&gt; clazz = proc.getClass();<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>        throw new Exception("the " + clazz + " class is not public");<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>      Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      assert ctor != null;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      }<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    } catch (Exception e) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      throw new BadProcedureException("The procedure class " + proc.getClass().getName() +<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        " must be accessible and have an empty constructor", e);<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>  // ==========================================================================<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 serializer for our Procedures. Instead of the previous serializer, it<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * uses the stateMessage list to store the internal state of the Procedures.<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static class StateSerializer implements ProcedureStateSerializer {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    private final ProcedureProtos.Procedure.Builder builder;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    private int deserializeIndex;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public StateSerializer(ProcedureProtos.Procedure.Builder builder) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      this.builder = builder;<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 void serialize(Message message) throws IOException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      Any packedMessage = Any.pack(message);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      builder.addStateMessage(packedMessage);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        throws IOException {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      if (deserializeIndex &gt;= builder.getStateMessageCount()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        throw new IOException("Invalid state message index: " + deserializeIndex);<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>      try {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        Any packedMessage = builder.getStateMessage(deserializeIndex++);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        return packedMessage.unpack(clazz);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      } catch (InvalidProtocolBufferException e) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        throw e.unwrapIOException();<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>  }<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 serializer (deserializer) for those Procedures which were serialized<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * before this patch. It deserializes the old, binary stateData field.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static class CompatStateSerializer implements ProcedureStateSerializer {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private InputStream inputStream;<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public CompatStateSerializer(InputStream inputStream) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this.inputStream = inputStream;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    public void serialize(Message message) throws IOException {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      throw new UnsupportedOperationException();<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>    @SuppressWarnings("unchecked")<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        throws IOException {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      Parser&lt;M&gt; parser = (Parser&lt;M&gt;) Internal.getDefaultInstance(clazz).getParserForType();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      try {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        return parser.parseDelimitedFrom(inputStream);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      } catch (InvalidProtocolBufferException e) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        throw e.unwrapIOException();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * Helper to convert the procedure to protobuf.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * Used by ProcedureStore implementations.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public static ProcedureProtos.Procedure convertToProtoProcedure(final Procedure proc)<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      throws IOException {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    Preconditions.checkArgument(proc != null);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    validateClass(proc);<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    final ProcedureProtos.Procedure.Builder builder = ProcedureProtos.Procedure.newBuilder()<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      .setClassName(proc.getClass().getName())<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      .setProcId(proc.getProcId())<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      .setState(proc.getState())<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      .setSubmittedTime(proc.getSubmittedTime())<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      .setLastUpdate(proc.getLastUpdate());<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>    if (proc.hasParent()) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      builder.setParentId(proc.getParentProcId());<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>    if (proc.hasTimeout()) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      builder.setTimeout(proc.getTimeout());<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>    if (proc.hasOwner()) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      builder.setOwner(proc.getOwner());<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>    final int[] stackIds = proc.getStackIndexes();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (stackIds != null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      for (int i = 0; i &lt; stackIds.length; ++i) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        builder.addStackId(stackIds[i]);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>    if (proc.hasException()) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      RemoteProcedureException exception = proc.getException();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      builder.setException(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        RemoteProcedureException.toProto(exception.getSource(), exception.getCause()));<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>    final byte[] result = proc.getResult();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    if (result != null) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      builder.setResult(UnsafeByteOperations.unsafeWrap(result));<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>    ProcedureStateSerializer serializer = new StateSerializer(builder);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    proc.serializeStateData(serializer);<a name="line.198"></a>
+<span class="sourceLineNo">087</span>  //  convert to and from Procedure object<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>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * A serializer for our Procedures. Instead of the previous serializer, it<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * uses the stateMessage list to store the internal state of the Procedures.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static class StateSerializer implements ProcedureStateSerializer {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    private final ProcedureProtos.Procedure.Builder builder;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    private int deserializeIndex;<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public StateSerializer(ProcedureProtos.Procedure.Builder builder) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      this.builder = builder;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>    @Override<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void serialize(Message message) throws IOException {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      Any packedMessage = Any.pack(message);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      builder.addStateMessage(packedMessage);<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>    @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        throws IOException {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      if (deserializeIndex &gt;= builder.getStateMessageCount()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        throw new IOException("Invalid state message index: " + deserializeIndex);<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>      try {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        Any packedMessage = builder.getStateMessage(deserializeIndex++);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        return packedMessage.unpack(clazz);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      } catch (InvalidProtocolBufferException e) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        throw e.unwrapIOException();<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>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * A serializer (deserializer) for those Procedures which were serialized<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * before this patch. It deserializes the old, binary stateData field.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static class CompatStateSerializer implements ProcedureStateSerializer {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    private InputStream inputStream;<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    public CompatStateSerializer(InputStream inputStream) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      this.inputStream = inputStream;<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>    @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    public void serialize(Message message) throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      throw new UnsupportedOperationException();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>    @SuppressWarnings("unchecked")<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        throws IOException {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      Parser&lt;M&gt; parser = (Parser&lt;M&gt;) Internal.getDefaultInstance(clazz).getParserForType();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        return parser.parseDelimitedFrom(inputStream);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      } catch (InvalidProtocolBufferException e) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        throw e.unwrapIOException();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<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>   * Helper to convert the procedure to protobuf.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * &lt;p/&gt;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * Used by ProcedureStore implementations.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  public static ProcedureProtos.Procedure convertToProtoProcedure(Procedure&lt;?&gt; proc)<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      throws IOException {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    Preconditions.checkArgument(proc != null);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    validateClass(proc);<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    final ProcedureProtos.Procedure.Builder builder = ProcedureProtos.Procedure.newBuilder()<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      .setClassName(proc.getClass().getName())<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      .setProcId(proc.getProcId())<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      .setState(proc.getState())<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      .setSubmittedTime(proc.getSubmittedTime())<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      .setLastUpdate(proc.getLastUpdate());<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    if (proc.hasParent()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      builder.setParentId(proc.getParentProcId());<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>    if (proc.hasTimeout()) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      builder.setTimeout(proc.getTimeout());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    if (proc.hasOwner()) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      builder.setOwner(proc.getOwner());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final int[] stackIds = proc.getStackIndexes();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    if (stackIds != null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      for (int i = 0; i &lt; stackIds.length; ++i) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        builder.addStackId(stackIds[i]);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (proc.hasException()) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      RemoteProcedureException exception = proc.getException();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      builder.setException(<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        RemoteProcedureException.toProto(exception.getSource(), exception.getCause()));<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>    final byte[] result = proc.getResult();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    if (result != null) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      builder.setResult(UnsafeByteOperations.unsafeWrap(result));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
 <span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (proc.getNonceKey() != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      builder.setNonceGroup(proc.getNonceKey().getNonceGroup());<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      builder.setNonce(proc.getNonceKey().getNonce());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>    if (proc.hasLock()) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      builder.setLocked(true);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (proc.isBypass()) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      builder.setBypass(true);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return builder.build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  /**<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * Helper to convert the protobuf procedure.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * Used by ProcedureStore implementations.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   *<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * TODO: OPTIMIZATION: some of the field never change during the execution<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   *                     (e.g. className, procId, parentId, ...).<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   *                     We can split in 'data' and 'state', and the store<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   *                     may take advantage of it by storing the data only on insert().<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  public static Procedure convertToProcedure(final ProcedureProtos.Procedure proto) throws IOException {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // Procedure from class name<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    final Procedure proc = newProcedure(proto.getClassName());<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    // set fields<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    proc.setProcId(proto.getProcId());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    proc.setState(proto.getState());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    proc.setSubmittedTime(proto.getSubmittedTime());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    proc.setLastUpdate(proto.getLastUpdate());<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (proto.hasParentId()) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      proc.setParentProcId(proto.getParentId());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">200</span>    ProcedureStateSerializer serializer = new StateSerializer(builder);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    proc.serializeStateData(serializer);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    if (proc.getNonceKey() != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      builder.setNonceGroup(proc.getNonceKey().getNonceGroup());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      builder.setNonce(proc.getNonceKey().getNonce());<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    if (proc.hasLock()) {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      builder.setLocked(true);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>    if (proc.isBypass()) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      builder.setBypass(true);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    return builder.build();<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>  /**<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * Helper to convert the protobuf procedure.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * &lt;p/&gt;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Used by ProcedureStore implementations.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * &lt;p/&gt;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * TODO: OPTIMIZATION: some of the field never change during the execution (e.g. className,<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * procId, parentId, ...). We can split in 'data' and 'state', and the store may take advantage of<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * it by storing the data only on insert().<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public static Procedure&lt;?&gt; convertToProcedure(ProcedureProtos.Procedure proto)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // Procedure from class name<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    Procedure&lt;?&gt; proc = newProcedure(proto.getClassName());<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // set fields<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    proc.setProcId(proto.getProcId());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    proc.setState(proto.getState());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    proc.setSubmittedTime(proto.getSubmittedTime());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    proc.setLastUpdate(proto.getLastUpdate());<a name="line.236"></a>
 <span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    if (proto.hasOwner()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      proc.setOwner(proto.getOwner());<a name="line.239"></a>
+<span class="sourceLineNo">238</span>    if (proto.hasParentId()) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      proc.setParentProcId(proto.getParentId());<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    if (proto.hasTimeout()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      proc.setTimeout(proto.getTimeout());<a name="line.243"></a>
+<span class="sourceLineNo">242</span>    if (proto.hasOwner()) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      proc.setOwner(proto.getOwner());<a name="line.243"></a>
 <span class="sourceLineNo">244</span>    }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (proto.getStackIdCount() &gt; 0) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      proc.setStackIndexes(proto.getStackIdList());<a name="line.247"></a>
+<span class="sourceLineNo">246</span>    if (proto.hasTimeout()) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      proc.setTimeout(proto.getTimeout());<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    }<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (proto.hasException()) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      assert proc.getState() == ProcedureProtos.ProcedureState.FAILED ||<a name="line.251"></a>
-<span class="sourceLineNo">252</span>             proc.getState() == ProcedureProtos.ProcedureState.ROLLEDBACK :<a name="line.252"></a>
-<span class="sourceLineNo">253</span>             "The procedure must be failed (waiting to rollback) or rolledback";<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      proc.setFailure(RemoteProcedureException.fromProto(proto.getException()));<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    if (proto.hasResult()) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      proc.setResult(proto.getResult().toByteArray());<a name="line.258"></a>
+<span class="sourceLineNo">250</span>    if (proto.getStackIdCount() &gt; 0) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      proc.setStackIndexes(proto.getStackIdList());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (proto.hasException()) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      assert proc.getState() == ProcedureProtos.ProcedureState.FAILED ||<a name="line.255"></a>
+<span class="sourceLineNo">256</span>             proc.getState() == ProcedureProtos.ProcedureState.ROLLEDBACK :<a name="line.256"></a>
+<span class="sourceLineNo">257</span>             "The procedure must be failed (waiting to rollback) or rolledback";<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      proc.setFailure(RemoteProcedureException.fromProto(proto.getException()));<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>    if (proto.getNonce() != HConstants.NO_NONCE) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      proc.setNonceKey(new NonceKey(proto.getNonceGroup(), proto.getNonce()));<a name="line.262"></a>
+<span class="sourceLineNo">261</span>    if (proto.hasResult()) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      proc.setResult(proto.getResult().toByteArray());<a name="line.262"></a>
 <span class="sourceLineNo">263</span>    }<a name="line.263"></a>
 <span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (proto.getLocked()) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      proc.lockedWhenLoading();<a name="line.266"></a>
+<span class="sourceLineNo">265</span>    if (proto.getNonce() != HConstants.NO_NONCE) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      proc.setNonceKey(new NonceKey(proto.getNonceGroup(), proto.getNonce()));<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    }<a name="line.267"></a>
 <span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>    if (proto.getBypass()) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      proc.bypass();<a name="line.270"></a>
+<span class="sourceLineNo">269</span>    if (proto.getLocked()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      proc.lockedWhenLoading();<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    }<a name="line.271"></a>
 <span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    ProcedureStateSerializer serializer = null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (proto.getStateMessageCount() &gt; 0) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      serializer = new StateSerializer(proto.toBuilder());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    } else if (proto.hasStateData()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      InputStream inputStream = proto.getStateData().newInput();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      serializer = new CompatStateSerializer(inputStream);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (serializer != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      proc.deserializeStateData(serializer);<a name="line.283"></a>
+<span class="sourceLineNo">273</span>    if (proto.getBypass()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      proc.bypass();<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>    ProcedureStateSerializer serializer = null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (proto.getStateMessageCount() &gt; 0) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      serializer = new StateSerializer(proto.toBuilder());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    } else if (proto.hasStateData()) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      InputStream inputStream = proto.getStateData().newInput();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      serializer = new CompatStateSerializer(inputStream);<a name="line.283"></a>
 <span class="sourceLineNo">284</span>    }<a name="line.284"></a>
 <span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    return proc;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  // ==========================================================================<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  //  convert from LockedResource object<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // ==========================================================================<a name="line.291"></a>
+<span class="sourceLineNo">286</span>    if (serializer != null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      proc.deserializeStateData(serializer);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return proc;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
 <span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>  public static LockServiceProtos.LockedResourceType convertToProtoResourceType(<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      LockedResourceType resourceType) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    return LockServiceProtos.LockedResourceType.valueOf(resourceType.name());<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>  public static LockServiceProtos.LockType convertToProtoLockType(LockType lockType) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    return LockServiceProtos.LockType.valueOf(lockType.name());<a name="line.299"></a>
+<span class="sourceLineNo">293</span>  // ==========================================================================<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  //  convert from LockedResource object<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  // ==========================================================================<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public static LockServiceProtos.LockedResourceType convertToProtoResourceType(<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LockedResourceType resourceType) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return LockServiceProtos.LockedResourceType.valueOf(resourceType.name());<a name="line.299"></a>
 <span class="sourceLineNo">300</span>  }<a name="line.300"></a>
 <span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public static LockServiceProtos.LockedResource convertToProtoLockedResource(<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      LockedResource lockedResource) throws IOException<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    LockServiceProtos.LockedResource.Builder builder =<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        LockServiceProtos.LockedResource.newBuilder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    builder<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        .setResourceType(convertToProtoResourceType(lockedResource.getResourceType()))<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        .setResourceName(lockedResource.getResourceName())<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        .setLockType(convertToProtoLockType(lockedResource.getLockType()));<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    Procedure&lt;?&gt; exclusiveLockOwnerProcedure = lockedResource.getExclusiveLockOwnerProcedure();<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>    if (exclusiveLockOwnerProcedure != null) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      ProcedureProtos.Procedure exclusiveLockOwnerProcedureProto =<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          convertToProtoProcedure(exclusiveLockOwnerProcedure);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      builder.setExclusiveLockOwnerProcedure(exclusiveLockOwnerProcedureProto);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    builder.setSharedLockCount(lockedResource.getSharedLockCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    for (Procedure&lt;?&gt; waitingProcedure : lockedResource.getWaitingProcedures()) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      ProcedureProtos.Procedure waitingProcedureProto =<a name="line.324"></a>
-<span class="sourceLineNo">325</span>          convertToProtoProcedure(waitingProcedure);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      builder.addWaitingProcedures(waitingProcedureProto);<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>    return builder.build();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>}<a name="line.331"></a>
+<span class="sourceLineNo">302</span>  public static LockServiceProtos.LockType convertToProtoLockType(LockType lockType) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    return LockServiceProtos.LockType.valueOf(lockType.name());<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>  public static LockServiceProtos.LockedResource convertToProtoLockedResource(<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      LockedResource lockedResource) throws IOException {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    LockServiceProtos.LockedResource.Builder builder =<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        LockServiceProtos.LockedResource.newBuilder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    builder<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        .setResourceType(convertToProtoResourceType(lockedResource.getResourceType()))<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        .setResourceName(lockedResource.getResourceName())<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        .setLockType(convertToProtoLockType(lockedResource.getLockType()));<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    Procedure&lt;?&gt; exclusiveLockOwnerProcedure = lockedResource.getExclusiveLockOwnerProcedure();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (exclusiveLockOwnerProcedure != null) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      ProcedureProtos.Procedure exclusiveLockOwnerProcedureProto =<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          convertToProtoProcedure(exclusiveLockOwnerProcedure);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      builder.setExclusiveLockOwnerProcedure(exclusiveLockOwnerProcedureProto);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>    builder.setSharedLockCount(lockedResource.getSharedLockCount());<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>    for (Procedure&lt;?&gt; waitingProcedure : lockedResource.getWaitingProcedures()) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      ProcedureProtos.Procedure waitingProcedureProto =<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          convertToProtoProcedure(waitingProcedure);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      builder.addWaitingProcedures(waitingProcedureProto);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    return builder.build();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * Get an exponential backoff time, in milliseconds. The base unit is 1 second, and the max<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * backoff time is 10 minutes. This is the general backoff policy for most procedure<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * implementation.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   */<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  public static long getBackoffTimeMs(int attempts) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    long maxBackoffTime = 10L * 60 * 1000; // Ten minutes, hard coded for now.<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    // avoid overflow<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    if (attempts &gt;= 30) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      return maxBackoffTime;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    return Math.min((long) (1000 * Math.pow(2, attempts)), maxBackoffTime);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index d1fab87..29c2124 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -395,7 +395,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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index d5cac42..04873df 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index d409416..435143a 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -411,7 +411,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index defb908..372a9ac 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 33f383c..88c1879 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 5345c25..6917155 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -491,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 902d847..da5bb2b 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 1f1b269..8c796e6 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index e18a38d..0338351 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 6535195..770e86b 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index c205d41..07aadaf 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 22942d6..6cd8b81 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index afcc395..e246bbb 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 7362504..84c6115 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index aaaf40d..cc15f2a 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index f3cdb90..488af61 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 9c361c6..5c21863 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index d676746..086a676 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 465c7be..9721deb 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index dc802ef..236e811 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 3724bf5..d327511 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1826,6 +1826,7 @@
 <li><a href="org/apache/hadoop/hbase/rest/client/TestRemoteTable.html" title="class in org.apache.hadoop.hbase.rest.client" target="classFrame">TestRemoteTable</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/TestRemoveFromSerialReplicationPeer.html" title="class in org.apache.hadoop.hbase.replication" target="classFrame">TestRemoveFromSerialReplicationPeer</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestRemoveRegionMetrics.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestRemoveRegionMetrics</a></li>
+<li><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestReopenTableRegionsProcedureBackoff</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestRepairAfterFailedDelete</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestReplicasClient.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestReplicasClient</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestReplicasClient.SlowMeCopro.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestReplicasClient.SlowMeCopro</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 127366f..21f1b42 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1826,6 +1826,7 @@
 <li><a href="org/apache/hadoop/hbase/rest/client/TestRemoteTable.html" title="class in org.apache.hadoop.hbase.rest.client">TestRemoteTable</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/TestRemoveFromSerialReplicationPeer.html" title="class in org.apache.hadoop.hbase.replication">TestRemoveFromSerialReplicationPeer</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestRemoveRegionMetrics.html" title="class in org.apache.hadoop.hbase.regionserver">TestRemoveRegionMetrics</a></li>
+<li><a href="org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.html" title="class in org.apache.hadoop.hbase.master.procedure">TestReopenTableRegionsProcedureBackoff</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.apache.hadoop.hbase.backup">TestRepairAfterFailedDelete</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestReplicasClient.html" title="class in org.apache.hadoop.hbase.client">TestReplicasClient</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestReplicasClient.SlowMeCopro.html" title="class in org.apache.hadoop.hbase.client">TestReplicasClient.SlowMeCopro</a></li>


[05/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</s

<TRUNCATED>

[25/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.


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

Branch: refs/heads/asf-site
Commit: dcc97e0160e849052dea83a5c974b1a5d7364365
Parents: 38e436c
Author: jenkins <bu...@apache.org>
Authored: Tue Sep 11 14:53:46 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Tue Sep 11 14:53:46 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |    90 +-
 checkstyle.rss                                  |    20 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |     6 +-
 devapidocs/index-all.html                       |    16 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/client/package-tree.html       |    26 +-
 .../hadoop/hbase/coprocessor/package-tree.html  |     2 +-
 .../hadoop/hbase/executor/package-tree.html     |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     4 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../assignment/TransitRegionStateProcedure.html |   133 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../procedure/ReopenTableRegionsProcedure.html  |    76 +-
 .../procedure/class-use/MasterProcedureEnv.html |    50 +-
 .../hbase/master/procedure/package-tree.html    |     4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |     8 +-
 .../hadoop/hbase/procedure2/Procedure.html      |    55 +-
 .../ProcedureUtil.CompatStateSerializer.html    |    10 +-
 .../ProcedureUtil.StateSerializer.html          |    12 +-
 .../hadoop/hbase/procedure2/ProcedureUtil.html  |    65 +-
 .../class-use/BadProcedureException.html        |     6 +-
 .../hbase/procedure2/class-use/Procedure.html   |    10 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     6 +-
 .../hadoop/hbase/quotas/package-tree.html       |    10 +-
 .../hadoop/hbase/regionserver/package-tree.html |    16 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/package-tree.html    |     4 +-
 .../hadoop/hbase/replication/package-tree.html  |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    10 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../assignment/TransitRegionStateProcedure.html |  1048 +-
 .../procedure/ReopenTableRegionsProcedure.html  |   259 +-
 .../hbase/procedure2/Procedure.LockState.html   |   549 +-
 .../hadoop/hbase/procedure2/Procedure.html      |   549 +-
 .../ProcedureUtil.CompatStateSerializer.html    |   533 +-
 .../ProcedureUtil.StateSerializer.html          |   533 +-
 .../hadoop/hbase/procedure2/ProcedureUtil.html  |   533 +-
 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/allclasses-frame.html            |     1 +
 testdevapidocs/allclasses-noframe.html          |     1 +
 testdevapidocs/index-all.html                   |    25 +
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hbase/class-use/HBaseClassTestRule.html     |    46 +-
 .../hbase/class-use/HBaseTestingUtility.html    |    24 +-
 .../procedure/TestProcedurePriority.MyCP.html   |     4 +-
 .../TestReopenTableRegionsProcedureBackoff.html |   405 +
 .../procedure/TestRestoreSnapshotProcedure.html |     4 +-
 .../TestReopenTableRegionsProcedureBackoff.html |   125 +
 .../hbase/master/procedure/package-frame.html   |     1 +
 .../hbase/master/procedure/package-summary.html |    23 +-
 .../hbase/master/procedure/package-tree.html    |     1 +
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 ...eUtil.TestProcedureNoDefaultConstructor.html |     4 +-
 .../hbase/procedure2/TestProcedureUtil.html     |    31 +-
 .../regionserver/TestHRegion.Appender.html      |    18 +-
 .../regionserver/TestHRegion.FlushThread.html   |    16 +-
 .../TestHRegion.GetTillDoneOrException.html     |    14 +-
 .../TestHRegion.HRegionForTesting.html          |     8 +-
 .../TestHRegion.HRegionWithSeqId.html           |     6 +-
 .../TestHRegion.HStoreForTesting.html           |     6 +-
 .../regionserver/TestHRegion.Incrementer.html   |    18 +-
 .../TestHRegion.IsFlushWALMarker.html           |    10 +-
 .../regionserver/TestHRegion.PutThread.html     |    24 +-
 .../hadoop/hbase/regionserver/TestHRegion.html  |   258 +-
 .../hadoop/hbase/regionserver/package-tree.html |     2 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 testdevapidocs/overview-tree.html               |     1 +
 .../TestReopenTableRegionsProcedureBackoff.html |   202 +
 ...eUtil.TestProcedureNoDefaultConstructor.html |    95 +-
 .../hbase/procedure2/TestProcedureUtil.html     |    95 +-
 .../regionserver/TestHRegion.Appender.html      | 11895 +++++++++--------
 .../regionserver/TestHRegion.FlushThread.html   | 11895 +++++++++--------
 .../TestHRegion.GetTillDoneOrException.html     | 11895 +++++++++--------
 .../TestHRegion.HRegionForTesting.html          | 11895 +++++++++--------
 .../TestHRegion.HRegionWithSeqId.html           | 11895 +++++++++--------
 .../TestHRegion.HStoreForTesting.html           | 11895 +++++++++--------
 .../regionserver/TestHRegion.Incrementer.html   | 11895 +++++++++--------
 .../TestHRegion.IsFlushWALMarker.html           | 11895 +++++++++--------
 .../regionserver/TestHRegion.PutThread.html     | 11895 +++++++++--------
 .../hadoop/hbase/regionserver/TestHRegion.html  | 11895 +++++++++--------
 119 files changed, 63119 insertions(+), 62138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index f0d89d2..460cd32 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index b3b9e13..e746450 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:20180910143323+00'00')
-/CreationDate (D:20180910144913+00'00')
+/ModDate (D:20180911143207+00'00')
+/CreationDate (D:20180911145024+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 97138d6..780c40c 100644
--- a/book.html
+++ b/book.html
@@ -41269,7 +41269,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-09-10 14:33:23 UTC
+Last updated 2018-09-11 14:32:07 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index bf0b30f..aab7314 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index ea796d2..a34a96a 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -281,10 +281,10 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>3734</td>
+<td>3735</td>
 <td>0</td>
 <td>0</td>
-<td>15234</td></tr></table></div>
+<td>15232</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -5572,7 +5572,7 @@
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureUtil.java">org/apache/hadoop/hbase/procedure2/ProcedureUtil.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>3</td></tr>
+<td>1</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.java">org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.java</a></td>
 <td>0</td>
@@ -9719,7 +9719,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#LeftCurly">LeftCurly</a></td>
-<td>193</td>
+<td>192</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
@@ -9813,12 +9813,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>734</td>
+<td>733</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3539</td>
+<td>3540</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -9836,7 +9836,7 @@
 <ul>
 <li>max: <tt>&quot;100&quot;</tt></li>
 <li>ignorePattern: <tt>&quot;^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated&quot;</tt></li></ul></td>
-<td>1488</td>
+<td>1487</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -19148,7 +19148,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 0 has parse error. Details: no viable alternative at input '   *' while parsing JAVADOC_TAG</td>
 <td>117</td></tr>
 <tr class="b">
@@ -71551,19 +71551,7 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.NonceKey' import.</td>
-<td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>224</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>304</td></tr></table></div>
+<td>35</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.java">org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.java</h3>
 <table border="0" class="table table-striped">
@@ -83824,169 +83812,169 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>296</td></tr>
+<td>297</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>472</td></tr>
+<td>473</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 6, expected level should be 8.</td>
-<td>1150</td></tr>
+<td>1151</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>1409</td></tr>
+<td>1411</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>1411</td></tr>
+<td>1413</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>1428</td></tr>
+<td>1430</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>1430</td></tr>
+<td>1432</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>2732</td></tr>
+<td>2735</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>3395</td></tr>
+<td>3398</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
-<td>3465</td></tr>
+<td>3468</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
-<td>3466</td></tr>
+<td>3469</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>3633</td></tr>
+<td>3636</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class PutThread should be declared as final.</td>
-<td>3644</td></tr>
+<td>3647</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>3820</td></tr>
+<td>3823</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>3882</td></tr>
+<td>3885</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4035</td></tr>
+<td>4038</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4046</td></tr>
+<td>4049</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4047</td></tr>
+<td>4050</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>4065</td></tr>
+<td>4068</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>4098</td></tr>
+<td>4101</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>4212</td></tr>
+<td>4217</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>4298</td></tr>
+<td>4303</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>4357</td></tr>
+<td>4362</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>4752</td></tr>
+<td>4757</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 160 lines (max allowed is 150).</td>
-<td>5192</td></tr>
+<td>5197</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>5655</td></tr>
+<td>5660</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>5670</td></tr>
+<td>5675</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>5698</td></tr></table></div>
+<td>5703</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java</h3>
 <table border="0" class="table table-striped">
@@ -118205,7 +118193,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 24705cf..cfa9873 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,8 +25,8 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3734,
-             Errors: 15234,
+      <title>File: 3735,
+             Errors: 15232,
              Warnings: 0,
              Infos: 0
       </title>
@@ -21433,7 +21433,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  3
+                  1
                 </td>
               </tr>
                           <tr>
@@ -26996,6 +26996,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.master.procedure.TestReopenTableRegionsProcedureBackoff.java">org/apache/hadoop/hbase/master/procedure/TestReopenTableRegionsProcedureBackoff.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.chaos.actions.ForceBalancerAction.java">org/apache/hadoop/hbase/chaos/actions/ForceBalancerAction.java</a>
                 </td>
                 <td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 4166a84..2a27833 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="20180910" />
+    <meta name="Date-Revision-yyyymmdd" content="20180911" />
     <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-09-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
             </p>
                 </div>
 

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index eba0fe0..a713a5b 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3824,21 +3824,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>"Mon Sep 10 14:44:14 UTC 2018"</code></td>
+<td class="colLast"><code>"Tue Sep 11 14:45:27 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>"2aae247e3f8f8a393b403a82593bdc3a1ba81193"</code></td>
+<td class="colLast"><code>"2ab8122a24eb8444c2804b7f980bf008f395933d"</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>"e11391d0d63dddbd28b87878935d57f3"</code></td>
+<td class="colLast"><code>"15a756b17eed0c34f46a577d4852d9ca"</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/dcc97e01/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index ef2ee59..cc36e63 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -4337,6 +4337,8 @@
 &nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#attempt">attempt</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#attempt">attempt</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ReopenTableRegionsProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/HBaseSaslRpcServer.html#attemptingUser">attemptingUser</a></span> - Variable in class org.apache.hadoop.hbase.security.<a href="org/apache/hadoop/hbase/security/HBaseSaslRpcServer.html" title="class in org.apache.hadoop.hbase.security">HBaseSaslRpcServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RetryCounter.html#attempts">attempts</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></dt>
@@ -17729,7 +17731,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoLockType-org.apache.hadoop.hbase.procedure2.LockType-">convertToProtoLockType(LockType)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">convertToProtoProcedure(Procedure)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">convertToProtoProcedure(Procedure&lt;?&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
 <dd>
 <div class="block">Helper to convert the procedure to protobuf.</div>
 </dd>
@@ -35244,8 +35246,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/backoff/ExponentialClientBackoffPolicy.html#getBackoffTime-org.apache.hadoop.hbase.ServerName-byte:A-org.apache.hadoop.hbase.client.backoff.ServerStatistics-">getBackoffTime(ServerName, byte[], ServerStatistics)</a></span> - Method in class org.apache.hadoop.hbase.client.backoff.<a href="org/apache/hadoop/hbase/client/backoff/ExponentialClientBackoffPolicy.html" title="class in org.apache.hadoop.hbase.client.backoff">ExponentialClientBackoffPolicy</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html#getBackoffTime-int-">getBackoffTime(int)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RetryCounter.BackoffPolicy.html#getBackoffTime-org.apache.hadoop.hbase.util.RetryCounter.RetryConfig-int-">getBackoffTime(RetryCounter.RetryConfig, int)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RetryCounter.BackoffPolicy.html" title="class in org.apache.hadoop.hbase.util">RetryCounter.BackoffPolicy</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RetryCounter.ExponentialBackoffPolicy.html#getBackoffTime-org.apache.hadoop.hbase.util.RetryCounter.RetryConfig-int-">getBackoffTime(RetryCounter.RetryConfig, int)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RetryCounter.ExponentialBackoffPolicy.html" title="class in org.apache.hadoop.hbase.util">RetryCounter.ExponentialBackoffPolicy</a></dt>
@@ -35256,6 +35256,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RetryCounter.html#getBackoffTimeAndIncrementAttempts--">getBackoffTimeAndIncrementAttempts()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#getBackoffTimeMs-int-">getBackoffTimeMs(int)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dd>
+<div class="block">Get an exponential backoff time, in milliseconds.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/FileLink.html#getBackReferenceFileName-org.apache.hadoop.fs.Path-">getBackReferenceFileName(Path)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/FileLink.html" title="class in org.apache.hadoop.hbase.io">FileLink</a></dt>
 <dd>
 <div class="block">Get the referenced file name from the reference link directory path.</div>
@@ -104926,6 +104930,10 @@ service.</div>
 <div class="block">Re run the procedure after every timeout to write new WAL entries so we don't hold back old
  WALs.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#setTimeoutFailure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">setTimeoutFailure(MasterProcedureEnv)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ReopenTableRegionsProcedure</a></dt>
+<dd>
+<div class="block">At end of timeout, wake ourselves up so we run again.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/Procedure.html#setTimeoutFailure-TEnvironment-">setTimeoutFailure(TEnvironment)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></dt>
 <dd>
 <div class="block">Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.</div>
@@ -119827,7 +119835,7 @@ service.</div>
 <dd>
 <div class="block">Generates the checksum for the header as well as the data and then validates it.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass(Procedure)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass(Procedure&lt;?&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/coprocessor/CoprocessorValidator.html#validateClasses-java.lang.ClassLoader-java.util.List-java.util.List-">validateClasses(ClassLoader, List&lt;String&gt;, List&lt;CoprocessorViolation&gt;)</a></span> - Method in class org.apache.hadoop.hbase.tool.coprocessor.<a href="org/apache/hadoop/hbase/tool/coprocessor/CoprocessorValidator.html" title="class in org.apache.hadoop.hbase.tool.coprocessor">CoprocessorValidator</a></dt>
 <dd>&nbsp;</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 f7aa217..ee3d758 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/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>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 45f6acb..69bbd77 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -555,24 +555,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/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/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/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index ce950b0..ae0124e 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,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.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 553eae8..ba00bfe 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,13 +183,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.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/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/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/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/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/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/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>
+<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/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 09ec76a..b2f6636 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -274,10 +274,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.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>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 0678f9b..6ec2fb5 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/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 <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/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/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>
 </ul>
 </li>
 </ul>


[08/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<sp

<TRUNCATED>

[20/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
index 91ab09c..a357453 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html
@@ -41,536 +41,530 @@
 <span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.procedure2.ProcedureMetrics;<a name="line.33"></a>
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.34"></a>
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
-<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionStateData;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>/**<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * The procedure to deal with the state transition of a region. A region with a TRSP in place is<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * called RIT, i.e, RegionInTransition.<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * &lt;p/&gt;<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * It can be used to assign/unassign/reopen/move a region, and for<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * {@link #unassign(MasterProcedureEnv, RegionInfo)} and<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * {@link #reopen(MasterProcedureEnv, RegionInfo)}, you do not need to specify a target server, and<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * for {@link #assign(MasterProcedureEnv, RegionInfo, ServerName)} and<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you want to you can provide a<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * target server. And for {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you do not<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * specify a targetServer, we will select one randomly.<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * &lt;p/&gt;<a name="line.58"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.procedure2.ProcedureUtil;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.procedure2.ProcedureYieldException;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.slf4j.Logger;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.slf4j.LoggerFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionState;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionStateTransitionStateData;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<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> * The procedure to deal with the state transition of a region. A region with a TRSP in place is<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * called RIT, i.e, RegionInTransition.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * &lt;p/&gt;<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * It can be used to assign/unassign/reopen/move a region, and for<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * {@link #unassign(MasterProcedureEnv, RegionInfo)} and<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * {@link #reopen(MasterProcedureEnv, RegionInfo)}, you do not need to specify a target server, and<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * for {@link #assign(MasterProcedureEnv, RegionInfo, ServerName)} and<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you want to you can provide a<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * target server. And for {@link #move(MasterProcedureEnv, RegionInfo, ServerName)}, if you do not<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * specify a targetServer, we will select one randomly.<a name="line.58"></a>
 <span class="sourceLineNo">059</span> * &lt;p/&gt;<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * The typical state transition for assigning a region is:<a name="line.60"></a>
-<span class="sourceLineNo">061</span> *<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * &lt;pre&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;/pre&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> *<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Notice that, if there are failures we may go back to the {@code GET_ASSIGN_CANDIDATE} state to<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * try again.<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;p/&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * The typical state transition for unassigning a region is:<a name="line.69"></a>
-<span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * &lt;pre&gt;<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * CLOSE -----&gt; CONFIRM_CLOSED<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;/pre&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> *<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * Here things go a bit different, if there are failures, especially that if there is a server<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * crash, we will go to the {@code GET_ASSIGN_CANDIDATE} state to bring the region online first, and<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * then go through the normal way to unassign it.<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * &lt;p/&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * The typical state transition for reopening/moving a region is:<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * &lt;pre&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * CLOSE -----&gt; CONFIRM_CLOSED -----&gt; GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * &lt;/pre&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> *<a name="line.84"></a>
-<span class="sourceLineNo">085</span> * The retry logic is the same with the above assign/unassign.<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p/&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * Notice that, although we allow specify a target server, it just acts as a candidate, we do not<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * guarantee that the region will finally be on the target server. If this is important for you, you<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * should check whether the region is on the target server after the procedure is finished.<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * &lt;p/&gt;<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * When you want to schedule a TRSP, please check whether there is still one for this region, and<a name="line.91"></a>
-<span class="sourceLineNo">092</span> * the check should be under the RegionStateNode lock. We will remove the TRSP from a<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * RegionStateNode when we are done, see the code in {@code reportTransition} method below. There<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * could be at most one TRSP for a give region.<a name="line.94"></a>
-<span class="sourceLineNo">095</span> */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>@InterfaceAudience.Private<a name="line.96"></a>
-<span class="sourceLineNo">097</span>public class TransitRegionStateProcedure<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    extends AbstractStateMachineRegionProcedure&lt;RegionStateTransitionState&gt; {<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  private static final Logger LOG = LoggerFactory.getLogger(TransitRegionStateProcedure.class);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private RegionStateTransitionState initialState;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private RegionStateTransitionState lastState;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  // the candidate where we want to assign the region to.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private ServerName assignCandidate;<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private boolean forceNewPlan;<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private int attempt;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  public TransitRegionStateProcedure() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>  private TransitRegionStateProcedure(MasterProcedureEnv env, RegionInfo hri,<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      ServerName assignCandidate, boolean forceNewPlan, RegionStateTransitionState initialState,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      RegionStateTransitionState lastState) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    super(env, hri);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    this.assignCandidate = assignCandidate;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    this.forceNewPlan = forceNewPlan;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    this.initialState = initialState;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    this.lastState = lastState;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public TableOperationType getTableOperationType() {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // TODO: maybe we should make another type here, REGION_TRANSITION?<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    return TableOperationType.REGION_EDIT;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  @Override<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      return false;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    // fail when updating meta so we wait until it is assigned.<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, getRegion());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private void queueAssign(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      throws ProcedureSuspendedException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // Here the assumption is that, the region must be in CLOSED state, so the region location<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    // will be null. And if we fail to open the region and retry here, the forceNewPlan will be<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    // true, and also we will set the region location to null.<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    boolean retain = false;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    if (!forceNewPlan) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      if (assignCandidate != null) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        retain = assignCandidate.equals(regionNode.getLastHost());<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        regionNode.setRegionLocation(assignCandidate);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      } else if (regionNode.getLastHost() != null) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        retain = true;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        LOG.info("Setting lastHost as the region location {}", regionNode.getLastHost());<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        regionNode.setRegionLocation(regionNode.getLastHost());<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    LOG.info("Starting {}; {}; forceNewPlan={}, retain={}", this, regionNode.toShortString(),<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      forceNewPlan, retain);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    env.getAssignmentManager().queueAssign(regionNode);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_OPEN);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    if (regionNode.getProcedureEvent().suspendIfNotReady(this)) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      throw new ProcedureSuspendedException();<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private void openRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    ServerName loc = regionNode.getRegionLocation();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    if (loc == null) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      LOG.warn("No location specified for {}, jump back to state {} to get one", getRegion(),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      return;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    env.getAssignmentManager().regionOpening(regionNode);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addChildProcedure(new OpenRegionProcedure(getRegion(), loc));<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED);<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>  private Flow confirmOpened(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      throws IOException {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    // notice that, for normal case, if we successfully opened a region, we will not arrive here, as<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    // in reportTransition we will call unsetProcedure, and in executeFromState we will return<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    // directly. But if the master is crashed before we finish the procedure, then next time we will<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    // arrive here. So we still need to add code for normal cases.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    if (regionNode.isInState(State.OPEN)) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      attempt = 0;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        // we are the last state, finish<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        regionNode.unsetProcedure(this);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        return Flow.NO_MORE_STATE;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      // It is possible that we arrive here but confirm opened is not the last state, for example,<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      // when merging or splitting a region, we unassign the region from a RS and the RS is crashed,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      // then there will be recovered edits for this region, we'd better make the region online<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // again and then unassign it, otherwise we have to fail the merge/split procedure as we may<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      // loss data.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return Flow.HAS_MORE_STATE;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (incrementAndCheckMaxAttempts(env, regionNode)) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      env.getAssignmentManager().regionFailedOpen(regionNode, true);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      setFailure(getClass().getSimpleName(), new RetriesExhaustedException(<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        "Max attempts " + env.getAssignmentManager().getAssignMaxAttempts() + " exceeded"));<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      regionNode.unsetProcedure(this);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      return Flow.NO_MORE_STATE;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    env.getAssignmentManager().regionFailedOpen(regionNode, false);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    // we failed to assign the region, force a new plan<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    forceNewPlan = true;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    regionNode.setRegionLocation(null);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // Here we do not throw exception because we want to the region to be online ASAP<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    return Flow.HAS_MORE_STATE;<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>  private void closeRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (regionNode.isInState(State.OPEN, State.CLOSING, State.MERGING, State.SPLITTING)) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // this is the normal case<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      env.getAssignmentManager().regionClosing(regionNode);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      addChildProcedure(<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        new CloseRegionProcedure(getRegion(), regionNode.getRegionLocation(), assignCandidate));<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    } else {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      forceNewPlan = true;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      regionNode.setRegionLocation(null);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<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><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  private Flow confirmClosed(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      throws IOException {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    // notice that, for normal case, if we successfully opened a region, we will not arrive here, as<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    // in reportTransition we will call unsetProcedure, and in executeFromState we will return<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // directly. But if the master is crashed before we finish the procedure, then next time we will<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    // arrive here. So we still need to add code for normal cases.<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (regionNode.isInState(State.CLOSED)) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      attempt = 0;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        // we are the last state, finish<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        regionNode.unsetProcedure(this);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        return Flow.NO_MORE_STATE;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      // This means we need to open the region again, should be a move or reopen<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      return Flow.HAS_MORE_STATE;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (regionNode.isInState(State.CLOSING)) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      // This is possible, think the target RS crashes and restarts immediately, the close region<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      // operation will return a NotServingRegionException soon, we can only recover after SCP takes<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      // care of this RS. So here we throw an IOException to let upper layer to retry with backoff.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      throw new HBaseIOException("Failed to close region");<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    // abnormally closed, need to reopen it, no matter what is the last state, see the comment in<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // confirmOpened for more details that why we need to reopen the region first even if we just<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    // want to close it.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // The only exception is for non-default replica, where we do not need to deal with recovered<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // edits. Notice that the region will remain in ABNORMALLY_CLOSED state, the upper layer need to<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    // deal with this state. For non-default replica, this is usually the same with CLOSED.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assert regionNode.isInState(State.ABNORMALLY_CLOSED);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    if (!RegionReplicaUtil.isDefaultReplica(getRegion()) &amp;&amp;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      regionNode.unsetProcedure(this);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      return Flow.NO_MORE_STATE;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    attempt = 0;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return Flow.HAS_MORE_STATE;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Override to lock RegionStateNode<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @SuppressWarnings("rawtypes")<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  protected Procedure[] execute(MasterProcedureEnv env)<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    RegionStateNode regionNode =<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    regionNode.lock();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return super.execute(env);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    } finally {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      regionNode.unlock();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private RegionStateNode getRegionStateNode(MasterProcedureEnv env) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @Override<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  protected Flow executeFromState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    RegionStateNode regionNode = getRegionStateNode(env);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    if (regionNode.getProcedure() != this) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      // This is possible, and is the normal case, as we will call unsetProcedure in<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      // reportTransition, this means we have already done<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      // This is because that, when we mark the region as OPENED or CLOSED, then all the works<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      // should have already been done, and logically we could have another TRSP scheduled for this<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      // region immediately(think of a RS crash at the point...).<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      return Flow.NO_MORE_STATE;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    try {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      switch (state) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        case REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE:<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          queueAssign(env, regionNode);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          return Flow.HAS_MORE_STATE;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        case REGION_STATE_TRANSITION_OPEN:<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          openRegion(env, regionNode);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          return Flow.HAS_MORE_STATE;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.313"></a>
-<span class="sourceLineNo">314</span>          return confirmOpened(env, regionNode);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        case REGION_STATE_TRANSITION_CLOSE:<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          closeRegion(env, regionNode);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          return Flow.HAS_MORE_STATE;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          return confirmClosed(env, regionNode);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        default:<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    } catch (IOException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      long backoff = getBackoffTime(this.attempt++);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      LOG.warn(<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        "Failed transition, suspend {}secs {}; {}; waiting on rectified condition fixed " +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>          "by other Procedure or operator intervention",<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        backoff / 1000, this, regionNode.toShortString(), e);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      setTimeout(Math.toIntExact(backoff));<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throw new ProcedureSuspendedException();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  @Override<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    env.getProcedureScheduler().addFront(this);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return false; // 'false' means that this procedure handled the timeout<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  private void reportTransitionOpened(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      ServerName serverName, TransitionCode code, long openSeqNum) throws IOException {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    switch (code) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      case OPENED:<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        if (openSeqNum &lt; 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          throw new UnexpectedStateException("Received report unexpected " + code +<a name="line.350"></a>
-<span class="sourceLineNo">351</span>            " transition openSeqNum=" + openSeqNum + ", " + regionNode);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        if (openSeqNum &lt;= regionNode.getOpenSeqNum()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          if (openSeqNum != 0) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            LOG.warn("Skip update of openSeqNum for {} with {} because the currentSeqNum={}",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>              regionNode, openSeqNum, regionNode.getOpenSeqNum());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        } else {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          regionNode.setOpenSeqNum(openSeqNum);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        env.getAssignmentManager().regionOpened(regionNode);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          // we are done<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          regionNode.unsetProcedure(this);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        break;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      case FAILED_OPEN:<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        // just wake up the procedure and see if we can retry<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        break;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      default:<a name="line.372"></a>
-<span class="sourceLineNo">373</span>        throw new UnexpectedStateException(<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          "Received report unexpected " + code + " transition openSeqNum=" + openSeqNum + ", " +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>            regionNode.toShortString() + ", " + this + ", expected OPENED or FAILED_OPEN.");<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>  // we do not need seqId for closing a region<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private void reportTransitionClosed(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      ServerName serverName, TransitionCode code) throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    switch (code) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      case CLOSED:<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        env.getAssignmentManager().regionClosed(regionNode, true);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          // we are done<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          regionNode.unsetProcedure(this);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        break;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      default:<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        throw new UnexpectedStateException("Received report unexpected " + code + " transition, " +<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          regionNode.toShortString() + ", " + this + ", expected CLOSED.");<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>  // Should be called with RegionStateNode locked<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  public void reportTransition(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ServerName serverName, TransitionCode code, long seqId) throws IOException {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    switch (getCurrentState()) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        reportTransitionOpened(env, regionNode, serverName, code, seqId);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        break;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        reportTransitionClosed(env, regionNode, serverName, code);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        break;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      default:<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        LOG.warn("{} received unexpected report transition call from {}, code={}, seqId={}", this,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          serverName, code, seqId);<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><a name="line.412"></a>
-<span class="sourceLineNo">413</span>  // Should be called with RegionStateNode locked<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public void serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      ServerName serverName) throws IOException {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    // Notice that, in this method, we do not change the procedure state, instead, we update the<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // region state in hbase:meta. This is because that, the procedure state change will not be<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    // persisted until the region is woken up and finish one step, if we crash before that then the<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // information will be lost. So here we will update the region state in hbase:meta, and when the<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // procedure is woken up, it will process the error and jump to the correct procedure state.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    RegionStateTransitionState currentState = getCurrentState();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    switch (currentState) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      case REGION_STATE_TRANSITION_CLOSE:<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        // for these 3 states, the region may still be online on the crashed server<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        if (serverName.equals(regionNode.getRegionLocation())) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          env.getAssignmentManager().regionClosed(regionNode, false);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          if (currentState != RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>            regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        break;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      default:<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        // If the procedure is in other 2 states, then actually we should not arrive here, as we<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        // know that the region is not online on any server, so we need to do nothing... But anyway<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        // let's add a log here<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("{} received unexpected server crash call for region {} from {}", this, regionNode,<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          serverName);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private long getBackoffTime(int attempts) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    long backoffTime = (long) (1000 * Math.pow(2, attempts));<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    long maxBackoffTime = 60 * 60 * 1000; // An hour. Hard-coded for for now.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return backoffTime &lt; maxBackoffTime ? backoffTime : maxBackoffTime;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>  private boolean incrementAndCheckMaxAttempts(MasterProcedureEnv env, RegionStateNode regionNode) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    int retries = env.getAssignmentManager().getRegionStates().addToFailedOpen(regionNode)<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      .incrementAndGetRetries();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    int max = env.getAssignmentManager().getAssignMaxAttempts();<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    LOG.info(<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      "Retry=" + retries + " of max=" + max + "; " + this + "; " + regionNode.toShortString());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    return retries &gt;= max;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  @Override<a name="line.459"></a>
-<span class="sourceLineNo">460</span>  protected void rollbackState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException, InterruptedException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // no rollback<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    throw new UnsupportedOperationException();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  @Override<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  protected RegionStateTransitionState getState(int stateId) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    return RegionStateTransitionState.forNumber(stateId);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  protected int getStateId(RegionStateTransitionState state) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    return state.getNumber();<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>  @Override<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  protected RegionStateTransitionState getInitialState() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    return initialState;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  @Override<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    super.serializeStateData(serializer);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    RegionStateTransitionStateData.Builder builder = RegionStateTransitionStateData.newBuilder()<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      .setInitialState(initialState).setLastState(lastState).setForceNewPlan(forceNewPlan);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    if (assignCandidate != null) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      builder.setAssignCandidate(ProtobufUtil.toServerName(assignCandidate));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    serializer.serialize(builder.build());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  }<a name="line.490"></a>
-<span class="sourceLineNo">491</span><a name="line.491"></a>
-<span class="sourceLineNo">492</span>  @Override<a name="line.492"></a>
-<span class="sourceLineNo">493</span>  protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    super.deserializeStateData(serializer);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    RegionStateTransitionStateData data =<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      serializer.deserialize(RegionStateTransitionStateData.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    initialState = data.getInitialState();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    lastState = data.getLastState();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    forceNewPlan = data.getForceNewPlan();<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    if (data.hasAssignCandidate()) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assignCandidate = ProtobufUtil.toServerName(data.getAssignCandidate());<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><a name="line.504"></a>
-<span class="sourceLineNo">505</span>  @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  protected ProcedureMetrics getProcedureMetrics(MasterProcedureEnv env) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    // TODO: need to reimplement the metrics system for assign/unassign<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (initialState == RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return env.getAssignmentManager().getAssignmentManagerMetrics().getAssignProcMetrics();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    } else {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return env.getAssignmentManager().getAssignmentManagerMetrics().getUnassignProcMetrics();<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  @Override<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    super.toStringClassDetails(sb);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    if (initialState == RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE) {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      sb.append(", ASSIGN");<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } else if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      sb.append(", UNASSIGN");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    } else {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      sb.append(", REOPEN/MOVE");<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">060</span> * &lt;p/&gt;<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * The typical state transition for assigning a region is:<a name="line.61"></a>
+<span class="sourceLineNo">062</span> *<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;pre&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;/pre&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> *<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * Notice that, if there are failures we may go back to the {@code GET_ASSIGN_CANDIDATE} state to<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * try again.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;p/&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * The typical state transition for unassigning a region is:<a name="line.70"></a>
+<span class="sourceLineNo">071</span> *<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * &lt;pre&gt;<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * CLOSE -----&gt; CONFIRM_CLOSED<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;/pre&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * Here things go a bit different, if there are failures, especially that if there is a server<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * crash, we will go to the {@code GET_ASSIGN_CANDIDATE} state to bring the region online first, and<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * then go through the normal way to unassign it.<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * &lt;p/&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * The typical state transition for reopening/moving a region is:<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * &lt;pre&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * CLOSE -----&gt; CONFIRM_CLOSED -----&gt; GET_ASSIGN_CANDIDATE ------&gt; OPEN -----&gt; CONFIRM_OPENED<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * &lt;/pre&gt;<a name="line.84"></a>
+<span class="sourceLineNo">085</span> *<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * The retry logic is the same with the above assign/unassign.<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * &lt;p/&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * Notice that, although we allow specify a target server, it just acts as a candidate, we do not<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * guarantee that the region will finally be on the target server. If this is important for you, you<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * should check whether the region is on the target server after the procedure is finished.<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * &lt;p/&gt;<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * When you want to schedule a TRSP, please check whether there is still one for this region, and<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * the check should be under the RegionStateNode lock. We will remove the TRSP from a<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * RegionStateNode when we are done, see the code in {@code reportTransition} method below. There<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * could be at most one TRSP for a give region.<a name="line.95"></a>
+<span class="sourceLineNo">096</span> */<a name="line.96"></a>
+<span class="sourceLineNo">097</span>@InterfaceAudience.Private<a name="line.97"></a>
+<span class="sourceLineNo">098</span>public class TransitRegionStateProcedure<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    extends AbstractStateMachineRegionProcedure&lt;RegionStateTransitionState&gt; {<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final Logger LOG = LoggerFactory.getLogger(TransitRegionStateProcedure.class);<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private RegionStateTransitionState initialState;<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private RegionStateTransitionState lastState;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // the candidate where we want to assign the region to.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private ServerName assignCandidate;<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  private boolean forceNewPlan;<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private int attempt;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public TransitRegionStateProcedure() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private TransitRegionStateProcedure(MasterProcedureEnv env, RegionInfo hri,<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      ServerName assignCandidate, boolean forceNewPlan, RegionStateTransitionState initialState,<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      RegionStateTransitionState lastState) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    super(env, hri);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    this.assignCandidate = assignCandidate;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    this.forceNewPlan = forceNewPlan;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    this.initialState = initialState;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.lastState = lastState;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  @Override<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public TableOperationType getTableOperationType() {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    // TODO: maybe we should make another type here, REGION_TRANSITION?<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    return TableOperationType.REGION_EDIT;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Override<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  protected boolean waitInitialized(MasterProcedureEnv env) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    if (TableName.isMetaTableName(getTableName())) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      return false;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    // First we need meta to be loaded, and second, if meta is not online then we will likely to<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    // fail when updating meta so we wait until it is assigned.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, getRegion());<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>  private void queueAssign(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      throws ProcedureSuspendedException {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    // Here the assumption is that, the region must be in CLOSED state, so the region location<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    // will be null. And if we fail to open the region and retry here, the forceNewPlan will be<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    // true, and also we will set the region location to null.<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    boolean retain = false;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    if (!forceNewPlan) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      if (assignCandidate != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        retain = assignCandidate.equals(regionNode.getLastHost());<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        regionNode.setRegionLocation(assignCandidate);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      } else if (regionNode.getLastHost() != null) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        retain = true;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        LOG.info("Setting lastHost as the region location {}", regionNode.getLastHost());<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        regionNode.setRegionLocation(regionNode.getLastHost());<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>    LOG.info("Starting {}; {}; forceNewPlan={}, retain={}", this, regionNode.toShortString(),<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      forceNewPlan, retain);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    env.getAssignmentManager().queueAssign(regionNode);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_OPEN);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    if (regionNode.getProcedureEvent().suspendIfNotReady(this)) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      throw new ProcedureSuspendedException();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>  private void openRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    ServerName loc = regionNode.getRegionLocation();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    if (loc == null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      LOG.warn("No location specified for {}, jump back to state {} to get one", getRegion(),<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      return;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    env.getAssignmentManager().regionOpening(regionNode);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addChildProcedure(new OpenRegionProcedure(getRegion(), loc));<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>  private Flow confirmOpened(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      throws IOException {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // notice that, for normal case, if we successfully opened a region, we will not arrive here, as<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // in reportTransition we will call unsetProcedure, and in executeFromState we will return<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    // directly. But if the master is crashed before we finish the procedure, then next time we will<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // arrive here. So we still need to add code for normal cases.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (regionNode.isInState(State.OPEN)) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      attempt = 0;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        // we are the last state, finish<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        regionNode.unsetProcedure(this);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        return Flow.NO_MORE_STATE;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      // It is possible that we arrive here but confirm opened is not the last state, for example,<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // when merging or splitting a region, we unassign the region from a RS and the RS is crashed,<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      // then there will be recovered edits for this region, we'd better make the region online<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      // again and then unassign it, otherwise we have to fail the merge/split procedure as we may<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // loss data.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      return Flow.HAS_MORE_STATE;<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>    if (incrementAndCheckMaxAttempts(env, regionNode)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      env.getAssignmentManager().regionFailedOpen(regionNode, true);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      setFailure(getClass().getSimpleName(), new RetriesExhaustedException(<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        "Max attempts " + env.getAssignmentManager().getAssignMaxAttempts() + " exceeded"));<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      regionNode.unsetProcedure(this);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      return Flow.NO_MORE_STATE;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    env.getAssignmentManager().regionFailedOpen(regionNode, false);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    // we failed to assign the region, force a new plan<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    forceNewPlan = true;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    regionNode.setRegionLocation(null);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    // Here we do not throw exception because we want to the region to be online ASAP<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    return Flow.HAS_MORE_STATE;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  private void closeRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (regionNode.isInState(State.OPEN, State.CLOSING, State.MERGING, State.SPLITTING)) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      // this is the normal case<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      env.getAssignmentManager().regionClosing(regionNode);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      addChildProcedure(<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        new CloseRegionProcedure(getRegion(), regionNode.getRegionLocation(), assignCandidate));<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      forceNewPlan = true;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      regionNode.setRegionLocation(null);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  }<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  private Flow confirmClosed(MasterProcedureEnv env, RegionStateNode regionNode)<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      throws IOException {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // notice that, for normal case, if we successfully opened a region, we will not arrive here, as<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // in reportTransition we will call unsetProcedure, and in executeFromState we will return<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    // directly. But if the master is crashed before we finish the procedure, then next time we will<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // arrive here. So we still need to add code for normal cases.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    if (regionNode.isInState(State.CLOSED)) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      attempt = 0;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        // we are the last state, finish<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        regionNode.unsetProcedure(this);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        return Flow.NO_MORE_STATE;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      // This means we need to open the region again, should be a move or reopen<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return Flow.HAS_MORE_STATE;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    if (regionNode.isInState(State.CLOSING)) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      // This is possible, think the target RS crashes and restarts immediately, the close region<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      // operation will return a NotServingRegionException soon, we can only recover after SCP takes<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      // care of this RS. So here we throw an IOException to let upper layer to retry with backoff.<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CLOSE);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      throw new HBaseIOException("Failed to close region");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // abnormally closed, need to reopen it, no matter what is the last state, see the comment in<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    // confirmOpened for more details that why we need to reopen the region first even if we just<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // want to close it.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // The only exception is for non-default replica, where we do not need to deal with recovered<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // edits. Notice that the region will remain in ABNORMALLY_CLOSED state, the upper layer need to<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // deal with this state. For non-default replica, this is usually the same with CLOSED.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assert regionNode.isInState(State.ABNORMALLY_CLOSED);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    if (!RegionReplicaUtil.isDefaultReplica(getRegion()) &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      regionNode.unsetProcedure(this);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      return Flow.NO_MORE_STATE;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    attempt = 0;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    return Flow.HAS_MORE_STATE;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  // Override to lock RegionStateNode<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @SuppressWarnings("rawtypes")<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected Procedure[] execute(MasterProcedureEnv env)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    RegionStateNode regionNode =<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    regionNode.lock();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      return super.execute(env);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      regionNode.unlock();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>  private RegionStateNode getRegionStateNode(MasterProcedureEnv env) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @Override<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  protected Flow executeFromState(MasterProcedureEnv env, RegionStateTransitionState state)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    RegionStateNode regionNode = getRegionStateNode(env);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    if (regionNode.getProcedure() != this) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      // This is possible, and is the normal case, as we will call unsetProcedure in<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      // reportTransition, this means we have already done<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      // This is because that, when we mark the region as OPENED or CLOSED, then all the works<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      // should have already been done, and logically we could have another TRSP scheduled for this<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // region immediately(think of a RS crash at the point...).<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      return Flow.NO_MORE_STATE;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      switch (state) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        case REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE:<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          queueAssign(env, regionNode);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          return Flow.HAS_MORE_STATE;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        case REGION_STATE_TRANSITION_OPEN:<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          openRegion(env, regionNode);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          return Flow.HAS_MORE_STATE;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        case REGION_STATE_TRANSITION_CONFIRM_OPENED:<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          return confirmOpened(env, regionNode);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        case REGION_STATE_TRANSITION_CLOSE:<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          closeRegion(env, regionNode);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          return Flow.HAS_MORE_STATE;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        case REGION_STATE_TRANSITION_CONFIRM_CLOSED:<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          return confirmClosed(env, regionNode);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        default:<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    } catch (IOException e) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      long backoff = ProcedureUtil.getBackoffTimeMs(this.attempt++);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      LOG.warn(<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        "Failed transition, suspend {}secs {}; {}; waiting on rectified condition fixed " +<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          "by other Procedure or operator intervention",<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        backoff / 1000, this, regionNode.toShortString(), e);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      setTimeout(Math.toIntExact(backoff));<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throw new ProcedureSuspendedException();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * At end of timeout, wake ourselves up so we run again.<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   */<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  @Override<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  protected synchronized boolean setTimeoutFailure(MasterProcedureEnv env) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    setState(ProcedureProtos.ProcedureState.RUNNABLE);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    env.getProcedureScheduler().addFront(this);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    return false; // 'false' means that this procedure handled the timeout<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  private void reportTransitionOpened(MasterProcedureEnv env, RegionStateNode regionNode,<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      ServerName serverName, TransitionCode code, long openSeqNum) throws IOException {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    switch (code) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      case OPENED:<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        if (openSeqNum &lt; 0) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          throw new UnexpectedStateException("Received report unexpected " + code +<a name="line.351"></a>
+<span class="sourceLineNo">352</span>            " transition openSeqNum=" + openSeqNum + ", " + regionNode);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        if (openSeqNum &lt;= regionNode.getOpenSeqNum()) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          if (openSeqNum != 0) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            LOG.warn("Skip update of openSeqNum for {} with {} because the currentSeqNum={}",<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              regionNode, openSeqNum, regionNode.getOpenSeqNum());<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        } else {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          regionNode.setOpenSeqNum(openSeqNum);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        env.getAssignmentManager().regionOpened(regionNode);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          // we are done<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          regionNode.unsetProcedure(this);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        break;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      case FAILED_OPEN:<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        // just wake up the procedure and see if we can retry<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        regionNode.getProcedureEvent().wake(env.getProcedureScheduler());<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        break;<a name="li

<TRUNCATED>

[06/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">688</s

<TRUNCATED>

[18/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.html
index c081310..c7f1e58 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/Procedure.html
@@ -774,280 +774,287 @@
 <span class="sourceLineNo">766</span><a name="line.766"></a>
 <span class="sourceLineNo">767</span>  /**<a name="line.767"></a>
 <span class="sourceLineNo">768</span>   * Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * @return true to let the framework handle the timeout as abort, false in case the procedure<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   *         handled the timeout itself.<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  protected synchronized boolean setTimeoutFailure(TEnvironment env) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    if (state == ProcedureState.WAITING_TIMEOUT) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      long timeDiff = EnvironmentEdgeManager.currentTime() - lastUpdate;<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      setFailure("ProcedureExecutor", new TimeoutIOException(<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        "Operation timed out after " + StringUtils.humanTimeDiff(timeDiff)));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      return true;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    return false;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
-<span class="sourceLineNo">781</span><a name="line.781"></a>
-<span class="sourceLineNo">782</span>  public synchronized boolean hasException() {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    return exception != null;<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public synchronized RemoteProcedureException getException() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return exception;<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>  /**<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  protected synchronized void setChildrenLatch(int numChildren) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.childrenLatch = numChildren;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (LOG.isTraceEnabled()) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      LOG.trace("CHILD LATCH INCREMENT SET " +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          this.childrenLatch, new Throwable(this.toString()));<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    }<a name="line.798"></a>
-<span class="sourceLineNo">799</span>  }<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>  /**<a name="line.801"></a>
-<span class="sourceLineNo">802</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.802"></a>
-<span class="sourceLineNo">803</span>   */<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  protected synchronized void incChildrenLatch() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    // TODO: can this be inferred from the stack? I think so...<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    this.childrenLatch++;<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    if (LOG.isTraceEnabled()) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>      LOG.trace("CHILD LATCH INCREMENT " + this.childrenLatch, new Throwable(this.toString()));<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  /**<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   * Called by the ProcedureExecutor to notify that one of the sub-procedures has completed.<a name="line.813"></a>
-<span class="sourceLineNo">814</span>   */<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  private synchronized boolean childrenCountDown() {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    assert childrenLatch &gt; 0: this;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    boolean b = --childrenLatch == 0;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    if (LOG.isTraceEnabled()) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      LOG.trace("CHILD LATCH DECREMENT " + childrenLatch, new Throwable(this.toString()));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    }<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    return b;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
-<span class="sourceLineNo">823</span><a name="line.823"></a>
-<span class="sourceLineNo">824</span>  /**<a name="line.824"></a>
-<span class="sourceLineNo">825</span>   * Try to set this procedure into RUNNABLE state.<a name="line.825"></a>
-<span class="sourceLineNo">826</span>   * Succeeds if all subprocedures/children are done.<a name="line.826"></a>
-<span class="sourceLineNo">827</span>   * @return True if we were able to move procedure to RUNNABLE state.<a name="line.827"></a>
-<span class="sourceLineNo">828</span>   */<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  synchronized boolean tryRunnable() {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    // Don't use isWaiting in the below; it returns true for WAITING and WAITING_TIMEOUT<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    if (getState() == ProcedureState.WAITING &amp;&amp; childrenCountDown()) {<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      setState(ProcedureState.RUNNABLE);<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      return true;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    } else {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      return false;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>  protected synchronized boolean hasChildren() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    return childrenLatch &gt; 0;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>  }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>  protected synchronized int getChildrenLatch() {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    return childrenLatch;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>  /**<a name="line.847"></a>
-<span class="sourceLineNo">848</span>   * Called by the RootProcedureState on procedure execution.<a name="line.848"></a>
-<span class="sourceLineNo">849</span>   * Each procedure store its stack-index positions.<a name="line.849"></a>
-<span class="sourceLineNo">850</span>   */<a name="line.850"></a>
-<span class="sourceLineNo">851</span>  protected synchronized void addStackIndex(final int index) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    if (stackIndexes == null) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      stackIndexes = new int[] { index };<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    } else {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      int count = stackIndexes.length;<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      stackIndexes = Arrays.copyOf(stackIndexes, count + 1);<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      stackIndexes[count] = index;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    }<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  }<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>  protected synchronized boolean removeStackIndex() {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (stackIndexes != null &amp;&amp; stackIndexes.length &gt; 1) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      stackIndexes = Arrays.copyOf(stackIndexes, stackIndexes.length - 1);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      return false;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    } else {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      stackIndexes = null;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      return true;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * Called on store load to initialize the Procedure internals after<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * the creation/deserialization.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   */<a name="line.874"></a>
-<span class="sourceLineNo">875</span>  protected synchronized void setStackIndexes(final List&lt;Integer&gt; stackIndexes) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    this.stackIndexes = new int[stackIndexes.size()];<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    for (int i = 0; i &lt; this.stackIndexes.length; ++i) {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      this.stackIndexes[i] = stackIndexes.get(i);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>  protected synchronized boolean wasExecuted() {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    return stackIndexes != null;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>  }<a name="line.884"></a>
-<span class="sourceLineNo">885</span><a name="line.885"></a>
-<span class="sourceLineNo">886</span>  protected synchronized int[] getStackIndexes() {<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    return stackIndexes;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>  // ==========================================================================<a name="line.890"></a>
-<span class="sourceLineNo">891</span>  //  Internal methods - called by the ProcedureExecutor<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  // ==========================================================================<a name="line.892"></a>
-<span class="sourceLineNo">893</span><a name="line.893"></a>
-<span class="sourceLineNo">894</span>  /**<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   * Internal method called by the ProcedureExecutor that starts the user-level code execute().<a name="line.895"></a>
-<span class="sourceLineNo">896</span>   * @throws ProcedureSuspendedException This is used when procedure wants to halt processing and<a name="line.896"></a>
-<span class="sourceLineNo">897</span>   *           skip out without changing states or releasing any locks held.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>   */<a name="line.898"></a>
-<span class="sourceLineNo">899</span>  protected Procedure&lt;TEnvironment&gt;[] doExecute(TEnvironment env)<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>    try {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      updateTimestamp();<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      if (bypass) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        LOG.info("{} bypassed, returning null to finish it", this);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        return null;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      return execute(env);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    } finally {<a name="line.908"></a>
+<span class="sourceLineNo">769</span>   * &lt;p/&gt;<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * Another usage for this method is to implement retrying. A procedure can set the state to<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   * {@code WAITING_TIMEOUT} by calling {@code setState} method, and throw a<a name="line.771"></a>
+<span class="sourceLineNo">772</span>   * {@link ProcedureSuspendedException} to halt the execution of the procedure, and do not forget a<a name="line.772"></a>
+<span class="sourceLineNo">773</span>   * call {@link #setTimeout(int)} method to set the timeout. And you should also override this<a name="line.773"></a>
+<span class="sourceLineNo">774</span>   * method to wake up the procedure, and also return false to tell the ProcedureExecutor that the<a name="line.774"></a>
+<span class="sourceLineNo">775</span>   * timeout event has been handled.<a name="line.775"></a>
+<span class="sourceLineNo">776</span>   * @return true to let the framework handle the timeout as abort, false in case the procedure<a name="line.776"></a>
+<span class="sourceLineNo">777</span>   *         handled the timeout itself.<a name="line.777"></a>
+<span class="sourceLineNo">778</span>   */<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  protected synchronized boolean setTimeoutFailure(TEnvironment env) {<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    if (state == ProcedureState.WAITING_TIMEOUT) {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>      long timeDiff = EnvironmentEdgeManager.currentTime() - lastUpdate;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      setFailure("ProcedureExecutor",<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        new TimeoutIOException("Operation timed out after " + StringUtils.humanTimeDiff(timeDiff)));<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      return true;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    return false;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>  }<a name="line.787"></a>
+<span class="sourceLineNo">788</span><a name="line.788"></a>
+<span class="sourceLineNo">789</span>  public synchronized boolean hasException() {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    return exception != null;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
+<span class="sourceLineNo">792</span><a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public synchronized RemoteProcedureException getException() {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    return exception;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
+<span class="sourceLineNo">798</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.798"></a>
+<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  protected synchronized void setChildrenLatch(int numChildren) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    this.childrenLatch = numChildren;<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    if (LOG.isTraceEnabled()) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      LOG.trace("CHILD LATCH INCREMENT SET " +<a name="line.803"></a>
+<span class="sourceLineNo">804</span>          this.childrenLatch, new Throwable(this.toString()));<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
+<span class="sourceLineNo">807</span><a name="line.807"></a>
+<span class="sourceLineNo">808</span>  /**<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   * Called by the ProcedureExecutor on procedure-load to restore the latch state<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   */<a name="line.810"></a>
+<span class="sourceLineNo">811</span>  protected synchronized void incChildrenLatch() {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    // TODO: can this be inferred from the stack? I think so...<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    this.childrenLatch++;<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    if (LOG.isTraceEnabled()) {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      LOG.trace("CHILD LATCH INCREMENT " + this.childrenLatch, new Throwable(this.toString()));<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  /**<a name="line.819"></a>
+<span class="sourceLineNo">820</span>   * Called by the ProcedureExecutor to notify that one of the sub-procedures has completed.<a name="line.820"></a>
+<span class="sourceLineNo">821</span>   */<a name="line.821"></a>
+<span class="sourceLineNo">822</span>  private synchronized boolean childrenCountDown() {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    assert childrenLatch &gt; 0: this;<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    boolean b = --childrenLatch == 0;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>    if (LOG.isTraceEnabled()) {<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      LOG.trace("CHILD LATCH DECREMENT " + childrenLatch, new Throwable(this.toString()));<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    return b;<a name="line.828"></a>
+<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Try to set this procedure into RUNNABLE state.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * Succeeds if all subprocedures/children are done.<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   * @return True if we were able to move procedure to RUNNABLE state.<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   */<a name="line.835"></a>
+<span class="sourceLineNo">836</span>  synchronized boolean tryRunnable() {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    // Don't use isWaiting in the below; it returns true for WAITING and WAITING_TIMEOUT<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    if (getState() == ProcedureState.WAITING &amp;&amp; childrenCountDown()) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>      setState(ProcedureState.RUNNABLE);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      return true;<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    } else {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      return false;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>  }<a name="line.844"></a>
+<span class="sourceLineNo">845</span><a name="line.845"></a>
+<span class="sourceLineNo">846</span>  protected synchronized boolean hasChildren() {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return childrenLatch &gt; 0;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  protected synchronized int getChildrenLatch() {<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    return childrenLatch;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>  }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>  /**<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * Called by the RootProcedureState on procedure execution.<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * Each procedure store its stack-index positions.<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   */<a name="line.857"></a>
+<span class="sourceLineNo">858</span>  protected synchronized void addStackIndex(final int index) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    if (stackIndexes == null) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      stackIndexes = new int[] { index };<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>      int count = stackIndexes.length;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      stackIndexes = Arrays.copyOf(stackIndexes, count + 1);<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      stackIndexes[count] = index;<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    }<a name="line.865"></a>
+<span class="sourceLineNo">866</span>  }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>  protected synchronized boolean removeStackIndex() {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>    if (stackIndexes != null &amp;&amp; stackIndexes.length &gt; 1) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      stackIndexes = Arrays.copyOf(stackIndexes, stackIndexes.length - 1);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      return false;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    } else {<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      stackIndexes = null;<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      return true;<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>  }<a name="line.876"></a>
+<span class="sourceLineNo">877</span><a name="line.877"></a>
+<span class="sourceLineNo">878</span>  /**<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * Called on store load to initialize the Procedure internals after<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * the creation/deserialization.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  protected synchronized void setStackIndexes(final List&lt;Integer&gt; stackIndexes) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    this.stackIndexes = new int[stackIndexes.size()];<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    for (int i = 0; i &lt; this.stackIndexes.length; ++i) {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      this.stackIndexes[i] = stackIndexes.get(i);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span>  }<a name="line.887"></a>
+<span class="sourceLineNo">888</span><a name="line.888"></a>
+<span class="sourceLineNo">889</span>  protected synchronized boolean wasExecuted() {<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    return stackIndexes != null;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>  }<a name="line.891"></a>
+<span class="sourceLineNo">892</span><a name="line.892"></a>
+<span class="sourceLineNo">893</span>  protected synchronized int[] getStackIndexes() {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    return stackIndexes;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>  }<a name="line.895"></a>
+<span class="sourceLineNo">896</span><a name="line.896"></a>
+<span class="sourceLineNo">897</span>  // ==========================================================================<a name="line.897"></a>
+<span class="sourceLineNo">898</span>  //  Internal methods - called by the ProcedureExecutor<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  // ==========================================================================<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Internal method called by the ProcedureExecutor that starts the user-level code execute().<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @throws ProcedureSuspendedException This is used when procedure wants to halt processing and<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   *           skip out without changing states or releasing any locks held.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>   */<a name="line.905"></a>
+<span class="sourceLineNo">906</span>  protected Procedure&lt;TEnvironment&gt;[] doExecute(TEnvironment env)<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    try {<a name="line.908"></a>
 <span class="sourceLineNo">909</span>      updateTimestamp();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  }<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   * Internal method called by the ProcedureExecutor that starts the user-level code rollback().<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   */<a name="line.915"></a>
-<span class="sourceLineNo">916</span>  protected void doRollback(TEnvironment env)<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      throws IOException, InterruptedException {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    try {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      updateTimestamp();<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      if (bypass) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        LOG.info("{} bypassed, skipping rollback", this);<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        return;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      rollback(env);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    } finally {<a name="line.925"></a>
+<span class="sourceLineNo">910</span>      if (bypass) {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>        LOG.info("{} bypassed, returning null to finish it", this);<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        return null;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      return execute(env);<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    } finally {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      updateTimestamp();<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>  }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>  /**<a name="line.920"></a>
+<span class="sourceLineNo">921</span>   * Internal method called by the ProcedureExecutor that starts the user-level code rollback().<a name="line.921"></a>
+<span class="sourceLineNo">922</span>   */<a name="line.922"></a>
+<span class="sourceLineNo">923</span>  protected void doRollback(TEnvironment env)<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      throws IOException, InterruptedException {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    try {<a name="line.925"></a>
 <span class="sourceLineNo">926</span>      updateTimestamp();<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>  }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>  final void restoreLock(TEnvironment env) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    if (!lockedWhenLoading) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      LOG.debug("{} didn't hold the lock before restarting, skip acquiring lock.", this);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return;<a name="line.933"></a>
+<span class="sourceLineNo">927</span>      if (bypass) {<a name="line.927"></a>
+<span class="sourceLineNo">928</span>        LOG.info("{} bypassed, skipping rollback", this);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        return;<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      rollback(env);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    } finally {<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      updateTimestamp();<a name="line.933"></a>
 <span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    if (isFinished()) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      LOG.debug("{} is already finished, skip acquiring lock.", this);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      return;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    }<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>    if (isBypass()) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.debug("{} is already bypassed, skip acquiring lock.", this);<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      return;<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    LOG.debug("{} held the lock before restarting, call acquireLock to restore it.", this);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    LockState state = acquireLock(env);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    assert state == LockState.LOCK_ACQUIRED;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>  }<a name="line.949"></a>
-<span class="sourceLineNo">950</span><a name="line.950"></a>
-<span class="sourceLineNo">951</span>  /**<a name="line.951"></a>
-<span class="sourceLineNo">952</span>   * Internal method called by the ProcedureExecutor that starts the user-level code acquireLock().<a name="line.952"></a>
-<span class="sourceLineNo">953</span>   */<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  final LockState doAcquireLock(TEnvironment env, ProcedureStore store) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    if (waitInitialized(env)) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    if (lockedWhenLoading) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      // reset it so we will not consider it anymore<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      lockedWhenLoading = false;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      locked = true;<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      // Here we return without persist the locked state, as lockedWhenLoading is true means<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      // that the locked field of the procedure stored in procedure store is true, so we do not need<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      // to store it again.<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return LockState.LOCK_ACQUIRED;<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    LockState state = acquireLock(env);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    if (state == LockState.LOCK_ACQUIRED) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      locked = true;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // persist that we have held the lock. This must be done before we actually execute the<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      // procedure, otherwise when restarting, we may consider the procedure does not have a lock,<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      // but it may have already done some changes as we have already executed it, and if another<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      // procedure gets the lock, then the semantic will be broken if the holdLock is true, as we do<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      // not expect that another procedure can be executed in the middle.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      store.update(this);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>    return state;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>  }<a name="line.978"></a>
-<span class="sourceLineNo">979</span><a name="line.979"></a>
-<span class="sourceLineNo">980</span>  /**<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * Internal method called by the ProcedureExecutor that starts the user-level code releaseLock().<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  final void doReleaseLock(TEnvironment env, ProcedureStore store) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    locked = false;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    // persist that we have released the lock. This must be done before we actually release the<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // lock. Another procedure may take this lock immediately after we release the lock, and if we<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    // crash before persist the information that we have already released the lock, then when<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    // restarting there will be two procedures which both have the lock and cause problems.<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    if (getState() != ProcedureState.ROLLEDBACK) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // If the state is ROLLEDBACK, it means that we have already deleted the procedure from<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      // procedure store, so do not need to log the release operation any more.<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      store.update(this);<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    releaseLock(env);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public int compareTo(final Procedure&lt;TEnvironment&gt; other) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    return Long.compare(getProcId(), other.getProcId());<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  //  misc utils<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  // ==========================================================================<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  /**<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>   * Get an hashcode for the specified Procedure ID<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>   * @return the hashcode for the specified procId<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   */<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public static long getProcIdHashCode(long procId) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    long h = procId;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    h ^= h &gt;&gt; 16;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    h *= 0x85ebca6b;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    h ^= h &gt;&gt; 13;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    h *= 0xc2b2ae35;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    h ^= h &gt;&gt; 16;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    return h;<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * Helper to lookup the root Procedure ID given a specified procedure.<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   */<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  protected static &lt;T&gt; Long getRootProcedureId(Map&lt;Long, Procedure&lt;T&gt;&gt; procedures,<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      Procedure&lt;T&gt; proc) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    while (proc.hasParent()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      proc = procedures.get(proc.getParentProcId());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (proc == null) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        return null;<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      }<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    return proc.getProcId();<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>  }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>  /**<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param a the first procedure to be compared.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   * @param b the second procedure to be compared.<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   * @return true if the two procedures have the same parent<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   */<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>  public static boolean haveSameParent(Procedure&lt;?&gt; a, Procedure&lt;?&gt; b) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    return a.hasParent() &amp;&amp; b.hasParent() &amp;&amp; (a.getParentProcId() == b.getParentProcId());<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>  }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>}<a name="line.1042"></a>
+<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
+<span class="sourceLineNo">936</span><a name="line.936"></a>
+<span class="sourceLineNo">937</span>  final void restoreLock(TEnvironment env) {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    if (!lockedWhenLoading) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      LOG.debug("{} didn't hold the lock before restarting, skip acquiring lock.", this);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>      return;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    if (isFinished()) {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      LOG.debug("{} is already finished, skip acquiring lock.", this);<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      return;<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    if (isBypass()) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      LOG.debug("{} is already bypassed, skip acquiring lock.", this);<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      return;<a name="line.950"></a>
+<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>    LOG.debug("{} held the lock before restarting, call acquireLock to restore it.", this);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    LockState state = acquireLock(env);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    assert state == LockState.LOCK_ACQUIRED;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
+<span class="sourceLineNo">957</span><a name="line.957"></a>
+<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
+<span class="sourceLineNo">959</span>   * Internal method called by the ProcedureExecutor that starts the user-level code acquireLock().<a name="line.959"></a>
+<span class="sourceLineNo">960</span>   */<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  final LockState doAcquireLock(TEnvironment env, ProcedureStore store) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    if (waitInitialized(env)) {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    if (lockedWhenLoading) {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      // reset it so we will not consider it anymore<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      lockedWhenLoading = false;<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      locked = true;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      // Here we return without persist the locked state, as lockedWhenLoading is true means<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      // that the locked field of the procedure stored in procedure store is true, so we do not need<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // to store it again.<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      return LockState.LOCK_ACQUIRED;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>    LockState state = acquireLock(env);<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    if (state == LockState.LOCK_ACQUIRED) {<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      locked = true;<a name="line.976"></a>
+<span class="sourceLineNo">977</span>      // persist that we have held the lock. This must be done before we actually execute the<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      // procedure, otherwise when restarting, we may consider the procedure does not have a lock,<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      // but it may have already done some changes as we have already executed it, and if another<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      // procedure gets the lock, then the semantic will be broken if the holdLock is true, as we do<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      // not expect that another procedure can be executed in the middle.<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      store.update(this);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span>    return state;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>  }<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>  /**<a name="line.987"></a>
+<span class="sourceLineNo">988</span>   * Internal method called by the ProcedureExecutor that starts the user-level code releaseLock().<a name="line.988"></a>
+<span class="sourceLineNo">989</span>   */<a name="line.989"></a>
+<span class="sourceLineNo">990</span>  final void doReleaseLock(TEnvironment env, ProcedureStore store) {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    locked = false;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    // persist that we have released the lock. This must be done before we actually release the<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    // lock. Another procedure may take this lock immediately after we release the lock, and if we<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    // crash before persist the information that we have already released the lock, then when<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    // restarting there will be two procedures which both have the lock and cause problems.<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    if (getState() != ProcedureState.ROLLEDBACK) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      // If the state is ROLLEDBACK, it means that we have already deleted the procedure from<a name="line.997"></a>
+<span class="sourceLineNo">998</span>      // procedure store, so do not need to log the release operation any more.<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      store.update(this);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    releaseLock(env);<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  }<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span><a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>  @Override<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  public int compareTo(final Procedure&lt;TEnvironment&gt; other) {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    return Long.compare(getProcId(), other.getProcId());<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>  // ==========================================================================<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>  //  misc utils<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>  // ==========================================================================<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>  /**<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>   * Get an hashcode for the specified Procedure ID<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>   * @return the hashcode for the specified procId<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>   */<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>  public static long getProcIdHashCode(long procId) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    long h = procId;<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    h ^= h &gt;&gt; 16;<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>    h *= 0x85ebca6b;<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>    h ^= h &gt;&gt; 13;<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    h *= 0xc2b2ae35;<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    h ^= h &gt;&gt; 16;<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    return h;<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  /**<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>   * Helper to lookup the root Procedure ID given a specified procedure.<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>   */<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>  protected static &lt;T&gt; Long getRootProcedureId(Map&lt;Long, Procedure&lt;T&gt;&gt; procedures,<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      Procedure&lt;T&gt; proc) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    while (proc.hasParent()) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      proc = procedures.get(proc.getParentProcId());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      if (proc == null) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    return proc.getProcId();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>  /**<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>   * @param a the first procedure to be compared.<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>   * @param b the second procedure to be compared.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>   * @return true if the two procedures have the same parent<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   */<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>  public static boolean haveSameParent(Procedure&lt;?&gt; a, Procedure&lt;?&gt; b) {<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    return a.hasParent() &amp;&amp; b.hasParent() &amp;&amp; (a.getParentProcId() == b.getParentProcId());<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>}<a name="line.1049"></a>
 
 
 


[17/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
index 76e3c88..0d97a1c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
@@ -52,291 +52,308 @@
 <span class="sourceLineNo">044</span>  // ==========================================================================<a name="line.44"></a>
 <span class="sourceLineNo">045</span>  //  Reflection helpers to create/validate a Procedure object<a name="line.45"></a>
 <span class="sourceLineNo">046</span>  // ==========================================================================<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public static Procedure newProcedure(final String className) throws BadProcedureException {<a name="line.47"></a>
+<span class="sourceLineNo">047</span>  private static Procedure&lt;?&gt; newProcedure(String className) throws BadProcedureException {<a name="line.47"></a>
 <span class="sourceLineNo">048</span>    try {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      final Class&lt;?&gt; clazz = Class.forName(className);<a name="line.49"></a>
+<span class="sourceLineNo">049</span>      Class&lt;?&gt; clazz = Class.forName(className);<a name="line.49"></a>
 <span class="sourceLineNo">050</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.50"></a>
 <span class="sourceLineNo">051</span>        throw new Exception("the " + clazz + " class is not public");<a name="line.51"></a>
 <span class="sourceLineNo">052</span>      }<a name="line.52"></a>
 <span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>      final Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      assert ctor != null : "no constructor found";<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.56"></a>
-<span class="sourceLineNo">057</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.57"></a>
-<span class="sourceLineNo">058</span>      }<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      return (Procedure)ctor.newInstance();<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    } catch (Exception e) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      throw new BadProcedureException("The procedure class " + className +<a name="line.61"></a>
-<span class="sourceLineNo">062</span>          " must be accessible and have an empty constructor", e);<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    }<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public static void validateClass(final Procedure proc) throws BadProcedureException {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    try {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      final Class&lt;?&gt; clazz = proc.getClass();<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>        throw new Exception("the " + clazz + " class is not public");<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>      final Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      assert ctor != null;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    } catch (Exception e) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      throw new BadProcedureException("The procedure class " + proc.getClass().getName() +<a name="line.79"></a>
-<span class="sourceLineNo">080</span>          " must be accessible and have an empty constructor", e);<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><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // ==========================================================================<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //  convert to and from Procedure object<a name="line.85"></a>
+<span class="sourceLineNo">054</span>      @SuppressWarnings("rawtypes")<a name="line.54"></a>
+<span class="sourceLineNo">055</span>      Constructor&lt;? extends Procedure&gt; ctor = clazz.asSubclass(Procedure.class).getConstructor();<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      assert ctor != null : "no constructor found";<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      }<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      return ctor.newInstance();<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    } catch (Exception e) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      throw new BadProcedureException(<a name="line.62"></a>
+<span class="sourceLineNo">063</span>        "The procedure class " + className + " must be accessible and have an empty constructor",<a name="line.63"></a>
+<span class="sourceLineNo">064</span>        e);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    }<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>  static void validateClass(Procedure&lt;?&gt; proc) throws BadProcedureException {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    try {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      Class&lt;?&gt; clazz = proc.getClass();<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      if (!Modifier.isPublic(clazz.getModifiers())) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>        throw new Exception("the " + clazz + " class is not public");<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>      Constructor&lt;?&gt; ctor = clazz.getConstructor();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      assert ctor != null;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      if (!Modifier.isPublic(ctor.getModifiers())) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        throw new Exception("the " + clazz + " constructor is not public");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      }<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    } catch (Exception e) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      throw new BadProcedureException("The procedure class " + proc.getClass().getName() +<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        " must be accessible and have an empty constructor", e);<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>  // ==========================================================================<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 serializer for our Procedures. Instead of the previous serializer, it<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * uses the stateMessage list to store the internal state of the Procedures.<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static class StateSerializer implements ProcedureStateSerializer {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    private final ProcedureProtos.Procedure.Builder builder;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    private int deserializeIndex;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public StateSerializer(ProcedureProtos.Procedure.Builder builder) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      this.builder = builder;<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 void serialize(Message message) throws IOException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      Any packedMessage = Any.pack(message);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      builder.addStateMessage(packedMessage);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        throws IOException {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      if (deserializeIndex &gt;= builder.getStateMessageCount()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        throw new IOException("Invalid state message index: " + deserializeIndex);<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>      try {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        Any packedMessage = builder.getStateMessage(deserializeIndex++);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        return packedMessage.unpack(clazz);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      } catch (InvalidProtocolBufferException e) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        throw e.unwrapIOException();<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>  }<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 serializer (deserializer) for those Procedures which were serialized<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * before this patch. It deserializes the old, binary stateData field.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private static class CompatStateSerializer implements ProcedureStateSerializer {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private InputStream inputStream;<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public CompatStateSerializer(InputStream inputStream) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this.inputStream = inputStream;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    public void serialize(Message message) throws IOException {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      throw new UnsupportedOperationException();<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>    @SuppressWarnings("unchecked")<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        throws IOException {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      Parser&lt;M&gt; parser = (Parser&lt;M&gt;) Internal.getDefaultInstance(clazz).getParserForType();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      try {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        return parser.parseDelimitedFrom(inputStream);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      } catch (InvalidProtocolBufferException e) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        throw e.unwrapIOException();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * Helper to convert the procedure to protobuf.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * Used by ProcedureStore implementations.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public static ProcedureProtos.Procedure convertToProtoProcedure(final Procedure proc)<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      throws IOException {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    Preconditions.checkArgument(proc != null);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    validateClass(proc);<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    final ProcedureProtos.Procedure.Builder builder = ProcedureProtos.Procedure.newBuilder()<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      .setClassName(proc.getClass().getName())<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      .setProcId(proc.getProcId())<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      .setState(proc.getState())<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      .setSubmittedTime(proc.getSubmittedTime())<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      .setLastUpdate(proc.getLastUpdate());<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>    if (proc.hasParent()) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      builder.setParentId(proc.getParentProcId());<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>    if (proc.hasTimeout()) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      builder.setTimeout(proc.getTimeout());<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>    if (proc.hasOwner()) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      builder.setOwner(proc.getOwner());<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>    final int[] stackIds = proc.getStackIndexes();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (stackIds != null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      for (int i = 0; i &lt; stackIds.length; ++i) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        builder.addStackId(stackIds[i]);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>    if (proc.hasException()) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      RemoteProcedureException exception = proc.getException();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      builder.setException(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        RemoteProcedureException.toProto(exception.getSource(), exception.getCause()));<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>    final byte[] result = proc.getResult();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    if (result != null) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      builder.setResult(UnsafeByteOperations.unsafeWrap(result));<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>    ProcedureStateSerializer serializer = new StateSerializer(builder);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    proc.serializeStateData(serializer);<a name="line.198"></a>
+<span class="sourceLineNo">087</span>  //  convert to and from Procedure object<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>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * A serializer for our Procedures. Instead of the previous serializer, it<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * uses the stateMessage list to store the internal state of the Procedures.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static class StateSerializer implements ProcedureStateSerializer {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    private final ProcedureProtos.Procedure.Builder builder;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    private int deserializeIndex;<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public StateSerializer(ProcedureProtos.Procedure.Builder builder) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      this.builder = builder;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>    @Override<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void serialize(Message message) throws IOException {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      Any packedMessage = Any.pack(message);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      builder.addStateMessage(packedMessage);<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>    @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        throws IOException {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      if (deserializeIndex &gt;= builder.getStateMessageCount()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        throw new IOException("Invalid state message index: " + deserializeIndex);<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>      try {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        Any packedMessage = builder.getStateMessage(deserializeIndex++);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        return packedMessage.unpack(clazz);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      } catch (InvalidProtocolBufferException e) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        throw e.unwrapIOException();<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>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * A serializer (deserializer) for those Procedures which were serialized<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * before this patch. It deserializes the old, binary stateData field.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private static class CompatStateSerializer implements ProcedureStateSerializer {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    private InputStream inputStream;<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    public CompatStateSerializer(InputStream inputStream) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      this.inputStream = inputStream;<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>    @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    public void serialize(Message message) throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      throw new UnsupportedOperationException();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>    @SuppressWarnings("unchecked")<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    public &lt;M extends Message&gt; M deserialize(Class&lt;M&gt; clazz)<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        throws IOException {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      Parser&lt;M&gt; parser = (Parser&lt;M&gt;) Internal.getDefaultInstance(clazz).getParserForType();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        return parser.parseDelimitedFrom(inputStream);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      } catch (InvalidProtocolBufferException e) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        throw e.unwrapIOException();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<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>   * Helper to convert the procedure to protobuf.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * &lt;p/&gt;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * Used by ProcedureStore implementations.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  public static ProcedureProtos.Procedure convertToProtoProcedure(Procedure&lt;?&gt; proc)<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      throws IOException {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    Preconditions.checkArgument(proc != null);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    validateClass(proc);<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    final ProcedureProtos.Procedure.Builder builder = ProcedureProtos.Procedure.newBuilder()<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      .setClassName(proc.getClass().getName())<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      .setProcId(proc.getProcId())<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      .setState(proc.getState())<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      .setSubmittedTime(proc.getSubmittedTime())<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      .setLastUpdate(proc.getLastUpdate());<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    if (proc.hasParent()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      builder.setParentId(proc.getParentProcId());<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>    if (proc.hasTimeout()) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      builder.setTimeout(proc.getTimeout());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    if (proc.hasOwner()) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      builder.setOwner(proc.getOwner());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final int[] stackIds = proc.getStackIndexes();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    if (stackIds != null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      for (int i = 0; i &lt; stackIds.length; ++i) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        builder.addStackId(stackIds[i]);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (proc.hasException()) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      RemoteProcedureException exception = proc.getException();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      builder.setException(<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        RemoteProcedureException.toProto(exception.getSource(), exception.getCause()));<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>    final byte[] result = proc.getResult();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    if (result != null) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      builder.setResult(UnsafeByteOperations.unsafeWrap(result));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
 <span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (proc.getNonceKey() != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      builder.setNonceGroup(proc.getNonceKey().getNonceGroup());<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      builder.setNonce(proc.getNonceKey().getNonce());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>    if (proc.hasLock()) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      builder.setLocked(true);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (proc.isBypass()) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      builder.setBypass(true);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return builder.build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  /**<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * Helper to convert the protobuf procedure.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * Used by ProcedureStore implementations.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   *<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * TODO: OPTIMIZATION: some of the field never change during the execution<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   *                     (e.g. className, procId, parentId, ...).<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   *                     We can split in 'data' and 'state', and the store<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   *                     may take advantage of it by storing the data only on insert().<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  public static Procedure convertToProcedure(final ProcedureProtos.Procedure proto) throws IOException {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // Procedure from class name<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    final Procedure proc = newProcedure(proto.getClassName());<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    // set fields<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    proc.setProcId(proto.getProcId());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    proc.setState(proto.getState());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    proc.setSubmittedTime(proto.getSubmittedTime());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    proc.setLastUpdate(proto.getLastUpdate());<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (proto.hasParentId()) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      proc.setParentProcId(proto.getParentId());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">200</span>    ProcedureStateSerializer serializer = new StateSerializer(builder);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    proc.serializeStateData(serializer);<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    if (proc.getNonceKey() != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      builder.setNonceGroup(proc.getNonceKey().getNonceGroup());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      builder.setNonce(proc.getNonceKey().getNonce());<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    if (proc.hasLock()) {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      builder.setLocked(true);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>    if (proc.isBypass()) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      builder.setBypass(true);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    return builder.build();<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>  /**<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * Helper to convert the protobuf procedure.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * &lt;p/&gt;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Used by ProcedureStore implementations.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * &lt;p/&gt;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * TODO: OPTIMIZATION: some of the field never change during the execution (e.g. className,<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * procId, parentId, ...). We can split in 'data' and 'state', and the store may take advantage of<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * it by storing the data only on insert().<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public static Procedure&lt;?&gt; convertToProcedure(ProcedureProtos.Procedure proto)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // Procedure from class name<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    Procedure&lt;?&gt; proc = newProcedure(proto.getClassName());<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // set fields<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    proc.setProcId(proto.getProcId());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    proc.setState(proto.getState());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    proc.setSubmittedTime(proto.getSubmittedTime());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    proc.setLastUpdate(proto.getLastUpdate());<a name="line.236"></a>
 <span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    if (proto.hasOwner()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      proc.setOwner(proto.getOwner());<a name="line.239"></a>
+<span class="sourceLineNo">238</span>    if (proto.hasParentId()) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      proc.setParentProcId(proto.getParentId());<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    if (proto.hasTimeout()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      proc.setTimeout(proto.getTimeout());<a name="line.243"></a>
+<span class="sourceLineNo">242</span>    if (proto.hasOwner()) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      proc.setOwner(proto.getOwner());<a name="line.243"></a>
 <span class="sourceLineNo">244</span>    }<a name="line.244"></a>
 <span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (proto.getStackIdCount() &gt; 0) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      proc.setStackIndexes(proto.getStackIdList());<a name="line.247"></a>
+<span class="sourceLineNo">246</span>    if (proto.hasTimeout()) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      proc.setTimeout(proto.getTimeout());<a name="line.247"></a>
 <span class="sourceLineNo">248</span>    }<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (proto.hasException()) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      assert proc.getState() == ProcedureProtos.ProcedureState.FAILED ||<a name="line.251"></a>
-<span class="sourceLineNo">252</span>             proc.getState() == ProcedureProtos.ProcedureState.ROLLEDBACK :<a name="line.252"></a>
-<span class="sourceLineNo">253</span>             "The procedure must be failed (waiting to rollback) or rolledback";<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      proc.setFailure(RemoteProcedureException.fromProto(proto.getException()));<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    if (proto.hasResult()) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      proc.setResult(proto.getResult().toByteArray());<a name="line.258"></a>
+<span class="sourceLineNo">250</span>    if (proto.getStackIdCount() &gt; 0) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      proc.setStackIndexes(proto.getStackIdList());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (proto.hasException()) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      assert proc.getState() == ProcedureProtos.ProcedureState.FAILED ||<a name="line.255"></a>
+<span class="sourceLineNo">256</span>             proc.getState() == ProcedureProtos.ProcedureState.ROLLEDBACK :<a name="line.256"></a>
+<span class="sourceLineNo">257</span>             "The procedure must be failed (waiting to rollback) or rolledback";<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      proc.setFailure(RemoteProcedureException.fromProto(proto.getException()));<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>    if (proto.getNonce() != HConstants.NO_NONCE) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      proc.setNonceKey(new NonceKey(proto.getNonceGroup(), proto.getNonce()));<a name="line.262"></a>
+<span class="sourceLineNo">261</span>    if (proto.hasResult()) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      proc.setResult(proto.getResult().toByteArray());<a name="line.262"></a>
 <span class="sourceLineNo">263</span>    }<a name="line.263"></a>
 <span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (proto.getLocked()) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      proc.lockedWhenLoading();<a name="line.266"></a>
+<span class="sourceLineNo">265</span>    if (proto.getNonce() != HConstants.NO_NONCE) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      proc.setNonceKey(new NonceKey(proto.getNonceGroup(), proto.getNonce()));<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    }<a name="line.267"></a>
 <span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>    if (proto.getBypass()) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      proc.bypass();<a name="line.270"></a>
+<span class="sourceLineNo">269</span>    if (proto.getLocked()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      proc.lockedWhenLoading();<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    }<a name="line.271"></a>
 <span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    ProcedureStateSerializer serializer = null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (proto.getStateMessageCount() &gt; 0) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      serializer = new StateSerializer(proto.toBuilder());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    } else if (proto.hasStateData()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      InputStream inputStream = proto.getStateData().newInput();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      serializer = new CompatStateSerializer(inputStream);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (serializer != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      proc.deserializeStateData(serializer);<a name="line.283"></a>
+<span class="sourceLineNo">273</span>    if (proto.getBypass()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      proc.bypass();<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>    ProcedureStateSerializer serializer = null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (proto.getStateMessageCount() &gt; 0) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      serializer = new StateSerializer(proto.toBuilder());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    } else if (proto.hasStateData()) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      InputStream inputStream = proto.getStateData().newInput();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      serializer = new CompatStateSerializer(inputStream);<a name="line.283"></a>
 <span class="sourceLineNo">284</span>    }<a name="line.284"></a>
 <span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    return proc;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  // ==========================================================================<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  //  convert from LockedResource object<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // ==========================================================================<a name="line.291"></a>
+<span class="sourceLineNo">286</span>    if (serializer != null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      proc.deserializeStateData(serializer);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return proc;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
 <span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>  public static LockServiceProtos.LockedResourceType convertToProtoResourceType(<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      LockedResourceType resourceType) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    return LockServiceProtos.LockedResourceType.valueOf(resourceType.name());<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>  public static LockServiceProtos.LockType convertToProtoLockType(LockType lockType) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    return LockServiceProtos.LockType.valueOf(lockType.name());<a name="line.299"></a>
+<span class="sourceLineNo">293</span>  // ==========================================================================<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  //  convert from LockedResource object<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  // ==========================================================================<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public static LockServiceProtos.LockedResourceType convertToProtoResourceType(<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LockedResourceType resourceType) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return LockServiceProtos.LockedResourceType.valueOf(resourceType.name());<a name="line.299"></a>
 <span class="sourceLineNo">300</span>  }<a name="line.300"></a>
 <span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public static LockServiceProtos.LockedResource convertToProtoLockedResource(<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      LockedResource lockedResource) throws IOException<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    LockServiceProtos.LockedResource.Builder builder =<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        LockServiceProtos.LockedResource.newBuilder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    builder<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        .setResourceType(convertToProtoResourceType(lockedResource.getResourceType()))<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        .setResourceName(lockedResource.getResourceName())<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        .setLockType(convertToProtoLockType(lockedResource.getLockType()));<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    Procedure&lt;?&gt; exclusiveLockOwnerProcedure = lockedResource.getExclusiveLockOwnerProcedure();<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>    if (exclusiveLockOwnerProcedure != null) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      ProcedureProtos.Procedure exclusiveLockOwnerProcedureProto =<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          convertToProtoProcedure(exclusiveLockOwnerProcedure);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      builder.setExclusiveLockOwnerProcedure(exclusiveLockOwnerProcedureProto);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    builder.setSharedLockCount(lockedResource.getSharedLockCount());<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    for (Procedure&lt;?&gt; waitingProcedure : lockedResource.getWaitingProcedures()) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      ProcedureProtos.Procedure waitingProcedureProto =<a name="line.324"></a>
-<span class="sourceLineNo">325</span>          convertToProtoProcedure(waitingProcedure);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      builder.addWaitingProcedures(waitingProcedureProto);<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>    return builder.build();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>}<a name="line.331"></a>
+<span class="sourceLineNo">302</span>  public static LockServiceProtos.LockType convertToProtoLockType(LockType lockType) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    return LockServiceProtos.LockType.valueOf(lockType.name());<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>  public static LockServiceProtos.LockedResource convertToProtoLockedResource(<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      LockedResource lockedResource) throws IOException {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    LockServiceProtos.LockedResource.Builder builder =<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        LockServiceProtos.LockedResource.newBuilder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    builder<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        .setResourceType(convertToProtoResourceType(lockedResource.getResourceType()))<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        .setResourceName(lockedResource.getResourceName())<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        .setLockType(convertToProtoLockType(lockedResource.getLockType()));<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    Procedure&lt;?&gt; exclusiveLockOwnerProcedure = lockedResource.getExclusiveLockOwnerProcedure();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (exclusiveLockOwnerProcedure != null) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      ProcedureProtos.Procedure exclusiveLockOwnerProcedureProto =<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          convertToProtoProcedure(exclusiveLockOwnerProcedure);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      builder.setExclusiveLockOwnerProcedure(exclusiveLockOwnerProcedureProto);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>    builder.setSharedLockCount(lockedResource.getSharedLockCount());<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>    for (Procedure&lt;?&gt; waitingProcedure : lockedResource.getWaitingProcedures()) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      ProcedureProtos.Procedure waitingProcedureProto =<a name="line.327"></a>
+<span class="sourceLineNo">328</span>          convertToProtoProcedure(waitingProcedure);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      builder.addWaitingProcedures(waitingProcedureProto);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    return builder.build();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * Get an exponential backoff time, in milliseconds. The base unit is 1 second, and the max<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * backoff time is 10 minutes. This is the general backoff policy for most procedure<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * implementation.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   */<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  public static long getBackoffTimeMs(int attempts) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    long maxBackoffTime = 10L * 60 * 1000; // Ten minutes, hard coded for now.<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    // avoid overflow<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    if (attempts &gt;= 30) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      return maxBackoffTime;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    return Math.min((long) (1000 * Math.pow(2, attempts)), maxBackoffTime);<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>
 
 
 


[22/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/procedure2/Procedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/Procedure.html b/devapidocs/org/apache/hadoop/hbase/procedure2/Procedure.html
index 705d349..06ffdbf 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/Procedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/Procedure.html
@@ -1911,8 +1911,15 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeoutFailure</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.772">setTimeoutFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env)</pre>
-<div class="block">Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.</div>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.779">setTimeoutFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env)</pre>
+<div class="block">Called by the ProcedureExecutor when the timeout set by setTimeout() is expired.
+ <p/>
+ Another usage for this method is to implement retrying. A procedure can set the state to
+ <code>WAITING_TIMEOUT</code> by calling <code>setState</code> method, and throw a
+ <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2"><code>ProcedureSuspendedException</code></a> to halt the execution of the procedure, and do not forget a
+ call <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#setTimeout-int-"><code>setTimeout(int)</code></a> method to set the timeout. And you should also override this
+ method to wake up the procedure, and also return false to tell the ProcedureExecutor that the
+ timeout event has been handled.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true to let the framework handle the timeout as abort, false in case the procedure
@@ -1926,7 +1933,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>hasException</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.782">hasException</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.789">hasException</a>()</pre>
 </li>
 </ul>
 <a name="getException--">
@@ -1935,7 +1942,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getException</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.786">getException</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/RemoteProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">RemoteProcedureException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.793">getException</a>()</pre>
 </li>
 </ul>
 <a name="setChildrenLatch-int-">
@@ -1944,7 +1951,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>setChildrenLatch</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.793">setChildrenLatch</a>(int&nbsp;numChildren)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.800">setChildrenLatch</a>(int&nbsp;numChildren)</pre>
 <div class="block">Called by the ProcedureExecutor on procedure-load to restore the latch state</div>
 </li>
 </ul>
@@ -1954,7 +1961,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>incChildrenLatch</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.804">incChildrenLatch</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.811">incChildrenLatch</a>()</pre>
 <div class="block">Called by the ProcedureExecutor on procedure-load to restore the latch state</div>
 </li>
 </ul>
@@ -1964,7 +1971,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>childrenCountDown</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.815">childrenCountDown</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.822">childrenCountDown</a>()</pre>
 <div class="block">Called by the ProcedureExecutor to notify that one of the sub-procedures has completed.</div>
 </li>
 </ul>
@@ -1974,7 +1981,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>tryRunnable</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.829">tryRunnable</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.836">tryRunnable</a>()</pre>
 <div class="block">Try to set this procedure into RUNNABLE state.
  Succeeds if all subprocedures/children are done.</div>
 <dl>
@@ -1989,7 +1996,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>hasChildren</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.839">hasChildren</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.846">hasChildren</a>()</pre>
 </li>
 </ul>
 <a name="getChildrenLatch--">
@@ -1998,7 +2005,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getChildrenLatch</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.843">getChildrenLatch</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.850">getChildrenLatch</a>()</pre>
 </li>
 </ul>
 <a name="addStackIndex-int-">
@@ -2007,7 +2014,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>addStackIndex</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.851">addStackIndex</a>(int&nbsp;index)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.858">addStackIndex</a>(int&nbsp;index)</pre>
 <div class="block">Called by the RootProcedureState on procedure execution.
  Each procedure store its stack-index positions.</div>
 </li>
@@ -2018,7 +2025,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>removeStackIndex</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.861">removeStackIndex</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.868">removeStackIndex</a>()</pre>
 </li>
 </ul>
 <a name="setStackIndexes-java.util.List-">
@@ -2027,7 +2034,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>setStackIndexes</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.875">setStackIndexes</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;stackIndexes)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.882">setStackIndexes</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;stackIndexes)</pre>
 <div class="block">Called on store load to initialize the Procedure internals after
  the creation/deserialization.</div>
 </li>
@@ -2038,7 +2045,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>wasExecuted</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.882">wasExecuted</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.889">wasExecuted</a>()</pre>
 </li>
 </ul>
 <a name="getStackIndexes--">
@@ -2047,7 +2054,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getStackIndexes</h4>
-<pre>protected&nbsp;int[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.886">getStackIndexes</a>()</pre>
+<pre>protected&nbsp;int[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.893">getStackIndexes</a>()</pre>
 </li>
 </ul>
 <a name="doExecute-java.lang.Object-">
@@ -2058,7 +2065,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>doExecute</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&gt;[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.899">doExecute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&gt;[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.906">doExecute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env)
                                        throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
                                               <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</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>
@@ -2080,7 +2087,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>doRollback</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.916">doRollback</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.923">doRollback</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</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">Internal method called by the ProcedureExecutor that starts the user-level code rollback().</div>
@@ -2099,7 +2106,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreLock</h4>
-<pre>final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.930">restoreLock</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env)</pre>
+<pre>final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.937">restoreLock</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env)</pre>
 </li>
 </ul>
 <a name="doAcquireLock-java.lang.Object-org.apache.hadoop.hbase.procedure2.store.ProcedureStore-">
@@ -2110,7 +2117,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>doAcquireLock</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.954">doAcquireLock</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env,
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.961">doAcquireLock</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env,
                                         <a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a>&nbsp;store)</pre>
 <div class="block">Internal method called by the ProcedureExecutor that starts the user-level code acquireLock().</div>
 </li>
@@ -2123,7 +2130,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>doReleaseLock</h4>
-<pre>final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.983">doReleaseLock</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env,
+<pre>final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.990">doReleaseLock</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&nbsp;env,
                          <a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a>&nbsp;store)</pre>
 <div class="block">Internal method called by the ProcedureExecutor that starts the user-level code releaseLock().</div>
 </li>
@@ -2134,7 +2141,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.998">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&gt;&nbsp;other)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.1005">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&gt;&nbsp;other)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="type parameter in Procedure">TEnvironment</a>&gt;&gt;</code></dd>
@@ -2147,7 +2154,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcIdHashCode</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.1010">getProcIdHashCode</a>(long&nbsp;procId)</pre>
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.1017">getProcIdHashCode</a>(long&nbsp;procId)</pre>
 <div class="block">Get an hashcode for the specified Procedure ID</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2161,7 +2168,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>getRootProcedureId</h4>
-<pre>protected static&nbsp;&lt;T&gt;&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.1023">getRootProcedureId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;T&gt;&gt;&nbsp;procedures,
+<pre>protected static&nbsp;&lt;T&gt;&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.1030">getRootProcedureId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;T&gt;&gt;&nbsp;procedures,
                                              <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;T&gt;&nbsp;proc)</pre>
 <div class="block">Helper to lookup the root Procedure ID given a specified procedure.</div>
 </li>
@@ -2172,7 +2179,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>haveSameParent</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.1039">haveSameParent</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;a,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/Procedure.html#line.1046">haveSameParent</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;a,
                                      <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;b)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
index cb211f5..d50a0d5 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.126">ProcedureUtil.CompatStateSerializer</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.128">ProcedureUtil.CompatStateSerializer</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/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a></pre>
 <div class="block">A serializer (deserializer) for those Procedures which were serialized
@@ -212,7 +212,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>inputStream</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.127">inputStream</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.129">inputStream</a></pre>
 </li>
 </ul>
 </li>
@@ -229,7 +229,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CompatStateSerializer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.129">CompatStateSerializer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a>&nbsp;inputStream)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.131">CompatStateSerializer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a>&nbsp;inputStream)</pre>
 </li>
 </ul>
 </li>
@@ -246,7 +246,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockList">
 <li class="blockList">
 <h4>serialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.134">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.136">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
                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>
@@ -262,7 +262,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserialize</h4>
-<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.140">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
+<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.CompatStateSerializer.html#line.142">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
                                                                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
index a17b810..02b46f6 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.92">ProcedureUtil.StateSerializer</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.94">ProcedureUtil.StateSerializer</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/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a></pre>
 <div class="block">A serializer for our Procedures. Instead of the previous serializer, it
@@ -216,7 +216,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockList">
 <li class="blockList">
 <h4>builder</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.93">builder</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.95">builder</a></pre>
 </li>
 </ul>
 <a name="deserializeIndex">
@@ -225,7 +225,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeIndex</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.94">deserializeIndex</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.96">deserializeIndex</a></pre>
 </li>
 </ul>
 </li>
@@ -242,7 +242,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StateSerializer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.96">StateSerializer</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder&nbsp;builder)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.98">StateSerializer</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure.Builder&nbsp;builder)</pre>
 </li>
 </ul>
 </li>
@@ -259,7 +259,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockList">
 <li class="blockList">
 <h4>serialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.101">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.103">serialize</a>(org.apache.hbase.thirdparty.com.google.protobuf.Message&nbsp;message)
                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>
@@ -275,7 +275,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserialize</h4>
-<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.107">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
+<pre>public&nbsp;&lt;M extends org.apache.hbase.thirdparty.com.google.protobuf.Message&gt;&nbsp;M&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.StateSerializer.html#line.109">deserialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;clazz)
                                                                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
index 5dfd906..0cae23c 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -179,7 +179,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
-<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></code></td>
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProcedure-org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure-">convertToProcedure</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;proto)</code>
 <div class="block">Helper to convert the protobuf procedure.</div>
 </td>
@@ -194,7 +194,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">convertToProtoProcedure</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</code>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">convertToProtoProcedure</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</code>
 <div class="block">Helper to convert the procedure to protobuf.</div>
 </td>
 </tr>
@@ -203,12 +203,18 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoResourceType-org.apache.hadoop.hbase.procedure2.LockedResourceType-">convertToProtoResourceType</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType)</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
-<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#newProcedure-java.lang.String-">newProcedure</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;className)</code>&nbsp;</td>
+<td class="colFirst"><code>static long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#getBackoffTimeMs-int-">getBackoffTimeMs</a></span>(int&nbsp;attempts)</code>
+<div class="block">Get an exponential backoff time, in milliseconds.</div>
+</td>
 </tr>
 <tr id="i6" class="altColor">
-<td class="colFirst"><code>static void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</code>&nbsp;</td>
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#newProcedure-java.lang.String-">newProcedure</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;className)</code>&nbsp;</td>
+</tr>
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code>(package private) static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -255,8 +261,8 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>newProcedure</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.47">newProcedure</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;className)
-                              throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.47">newProcedure</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;className)
+                                  throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></code></dd>
@@ -269,8 +275,8 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>validateClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.66">validateClass</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)
-                          throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></pre>
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.68">validateClass</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)
+                   throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/BadProcedureException.html" title="class in org.apache.hadoop.hbase.procedure2">BadProcedureException</a></code></dd>
@@ -283,9 +289,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoProcedure</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.155">convertToProtoProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.158">convertToProtoProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)
                                                                                                            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 to convert the procedure to protobuf.
+ <p/>
  Used by ProcedureStore implementations.</div>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -299,15 +306,15 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProcedure</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.224">convertToProcedure</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;proto)
-                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.227">convertToProcedure</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;proto)
+                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Helper to convert the protobuf procedure.
+ <p/>
  Used by ProcedureStore implementations.
-
- TODO: OPTIMIZATION: some of the field never change during the execution
-                     (e.g. className, procId, parentId, ...).
-                     We can split in 'data' and 'state', and the store
-                     may take advantage of it by storing the data only on insert().</div>
+ <p/>
+ TODO: OPTIMIZATION: some of the field never change during the execution (e.g. className,
+ procId, parentId, ...). We can split in 'data' and 'state', and the store may take advantage of
+ it by storing the data only on insert().</div>
 <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>
@@ -320,7 +327,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoResourceType</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResourceType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.293">convertToProtoResourceType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType)</pre>
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResourceType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.297">convertToProtoResourceType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockedResourceType</a>&nbsp;resourceType)</pre>
 </li>
 </ul>
 <a name="convertToProtoLockType-org.apache.hadoop.hbase.procedure2.LockType-">
@@ -329,16 +336,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoLockType</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.298">convertToProtoLockType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockType</a>&nbsp;lockType)</pre>
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockType&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.302">convertToProtoLockType</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2">LockType</a>&nbsp;lockType)</pre>
 </li>
 </ul>
 <a name="convertToProtoLockedResource-org.apache.hadoop.hbase.procedure2.LockedResource-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>convertToProtoLockedResource</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResource&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.302">convertToProtoLockedResource</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&nbsp;lockedResource)
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockedResource&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.306">convertToProtoLockedResource</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResource.html" title="class in org.apache.hadoop.hbase.procedure2">LockedResource</a>&nbsp;lockedResource)
                                                                                                                        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>
@@ -346,6 +353,18 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="getBackoffTimeMs-int-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getBackoffTimeMs</h4>
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#line.340">getBackoffTimeMs</a>(int&nbsp;attempts)</pre>
+<div class="block">Get an exponential backoff time, in milliseconds. The base unit is 1 second, and the max
+ backoff time is 10 minutes. This is the general backoff policy for most procedure
+ implementation.</div>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/BadProcedureException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/BadProcedureException.html b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/BadProcedureException.html
index a3bf606..3bca4e1 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/BadProcedureException.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/BadProcedureException.html
@@ -103,12 +103,12 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></code></td>
+<td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#newProcedure-java.lang.String-">newProcedure</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;className)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>static void</code></td>
-<td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</code>&nbsp;</td>
+<td class="colFirst"><code>(package private) static void</code></td>
+<td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
index 937e9c2..7de037e 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/class-use/Procedure.html
@@ -1038,7 +1038,7 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></code></td>
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProcedure-org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure-">convertToProcedure</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure&nbsp;proto)</code>
 <div class="block">Helper to convert the protobuf procedure.</div>
 </td>
@@ -1117,7 +1117,7 @@
                   <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;[]&nbsp;subprocs)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></code></td>
+<td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#newProcedure-java.lang.String-">newProcedure</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;className)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
@@ -1267,7 +1267,7 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure</code></td>
-<td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">convertToProtoProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</code>
+<td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProtoProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">convertToProtoProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</code>
 <div class="block">Helper to convert the procedure to protobuf.</div>
 </td>
 </tr>
@@ -1466,8 +1466,8 @@
                  <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;[]&nbsp;subprocs)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>static void</code></td>
-<td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</code>&nbsp;</td>
+<td class="colFirst"><code>(package private) static void</code></td>
+<td class="colLast"><span class="typeNameLabel">ProcedureUtil.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#validateClass-org.apache.hadoop.hbase.procedure2.Procedure-">validateClass</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 4de49ac..869db37 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -709,20 +709,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/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/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/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/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/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/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/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/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/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/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/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/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/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/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <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/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
 </ul>
 </li>
 </ul>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index 3c7146a..f8e4b11 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -160,8 +160,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.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 67b7e3a..6ef281d 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/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>
 <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>
 </ul>
 </li>
 </ul>

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


[12/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
index 404b2c5..5ecb88d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
@@ -1299,7 +1299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloseCarryingSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.299">testCloseCarryingSnapshot</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.300">testCloseCarryingSnapshot</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Test for Bug 2 of HBASE-10466.
  "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize
@@ -1320,7 +1320,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMemstoreSnapshotSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.325">testMemstoreSnapshotSize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.326">testMemstoreSnapshotSize</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>
@@ -1334,7 +1334,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALCompatibleWithFaultyFileSystem</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.379">createWALCompatibleWithFaultyFileSystem</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;callingMethod,
+<pre>private static&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.380">createWALCompatibleWithFaultyFileSystem</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;callingMethod,
                                                                                        org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                                        org.apache.hadoop.hbase.TableName&nbsp;tableName)
                                                                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1356,7 +1356,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMemstoreSizeAccountingWithFailedPostBatchMutate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.389">testMemstoreSizeAccountingWithFailedPostBatchMutate</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.390">testMemstoreSizeAccountingWithFailedPostBatchMutate</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>
@@ -1370,7 +1370,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushAndMemstoreSizeCounting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.434">testFlushAndMemstoreSizeCounting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.435">testFlushAndMemstoreSizeCounting</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">A test case of HBASE-21041</div>
 <dl>
@@ -1385,7 +1385,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushSizeAccounting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.475">testFlushSizeAccounting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.476">testFlushSizeAccounting</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test we do not lose data if we fail a flush and then close.
  Part of HBase-10466.  Tests the following from the issue description:
@@ -1411,7 +1411,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloseWithFailingFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.540">testCloseWithFailingFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.541">testCloseWithFailingFlush</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>
@@ -1425,7 +1425,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompactionAffectedByScanners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.595">testCompactionAffectedByScanners</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.597">testCompactionAffectedByScanners</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>
@@ -1439,7 +1439,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testToShowNPEOnRegionScannerReseek</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.643">testToShowNPEOnRegionScannerReseek</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.645">testToShowNPEOnRegionScannerReseek</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>
@@ -1453,7 +1453,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplay</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.673">testSkipRecoveredEditsReplay</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.675">testSkipRecoveredEditsReplay</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>
@@ -1467,7 +1467,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplaySomeIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.724">testSkipRecoveredEditsReplaySomeIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.726">testSkipRecoveredEditsReplaySomeIgnored</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>
@@ -1481,7 +1481,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplayAllIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.780">testSkipRecoveredEditsReplayAllIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.782">testSkipRecoveredEditsReplayAllIgnored</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>
@@ -1495,7 +1495,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplayTheLastFileIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.807">testSkipRecoveredEditsReplayTheLastFileIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.809">testSkipRecoveredEditsReplayTheLastFileIgnored</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>
@@ -1509,7 +1509,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveredEditsReplayCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.870">testRecoveredEditsReplayCompaction</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.872">testRecoveredEditsReplayCompaction</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>
@@ -1523,7 +1523,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveredEditsReplayCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.875">testRecoveredEditsReplayCompaction</a>(boolean&nbsp;mismatchedRegionName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.877">testRecoveredEditsReplayCompaction</a>(boolean&nbsp;mismatchedRegionName)
                                         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>
@@ -1537,7 +1537,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushMarkers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.984">testFlushMarkers</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.986">testFlushMarkers</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>
@@ -1551,7 +1551,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushMarkersWALFail</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1136">testFlushMarkersWALFail</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1137">testFlushMarkersWALFail</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>
@@ -1565,7 +1565,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetWhileRegionClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1247">testGetWhileRegionClose</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1248">testGetWhileRegionClose</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>
@@ -1579,7 +1579,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWeirdCacheBehaviour</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1332">testWeirdCacheBehaviour</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1334">testWeirdCacheBehaviour</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>
@@ -1593,7 +1593,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendWithReadOnlyTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1370">testAppendWithReadOnlyTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1372">testAppendWithReadOnlyTable</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>
@@ -1607,7 +1607,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testIncrWithReadOnlyTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1387">testIncrWithReadOnlyTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1389">testIncrWithReadOnlyTable</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>
@@ -1621,7 +1621,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteColumns</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1402">deleteColumns</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1404">deleteColumns</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                            <a href="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;value,
                            <a href="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;keyPrefix)
                     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>
@@ -1637,7 +1637,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumberOfRows</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1421">getNumberOfRows</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;keyPrefix,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1423">getNumberOfRows</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;keyPrefix,
                             <a href="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;value,
                             org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
                      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>
@@ -1653,7 +1653,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>buildScanner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1440">buildScanner</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;keyPrefix,
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1442">buildScanner</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;keyPrefix,
                                                                           <a href="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;value,
                                                                           org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
                                                                    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>
@@ -1669,7 +1669,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putRows</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1460">putRows</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1462">putRows</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                      int&nbsp;numRows,
                      <a href="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;value,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
@@ -1686,7 +1686,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFamilyWithAndWithoutColon</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1476">testFamilyWithAndWithoutColon</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1478">testFamilyWithAndWithoutColon</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>
@@ -1700,7 +1700,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPut_whileNoRowLocksHeld</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1492">testBatchPut_whileNoRowLocksHeld</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1494">testBatchPut_whileNoRowLocksHeld</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>
@@ -1714,7 +1714,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPut_whileMultipleRowLocksHeld</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1517">testBatchPut_whileMultipleRowLocksHeld</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1519">testBatchPut_whileMultipleRowLocksHeld</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>
@@ -1728,7 +1728,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForCounter</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1590">waitForCounter</a>(org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1593">waitForCounter</a>(org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
                             <a href="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;metricName,
                             long&nbsp;expectedCount)
                      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>
@@ -1744,7 +1744,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAtomicBatchPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1604">testAtomicBatchPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1607">testAtomicBatchPut</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>
@@ -1758,7 +1758,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPutWithTsSlop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1668">testBatchPutWithTsSlop</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1671">testBatchPutWithTsSlop</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>
@@ -1772,7 +1772,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareRegionForBachPut</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1687">prepareRegionForBachPut</a>(org.apache.hadoop.hbase.client.Put[]&nbsp;puts,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1690">prepareRegionForBachPut</a>(org.apache.hadoop.hbase.client.Put[]&nbsp;puts,
                                      org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
                                      boolean&nbsp;slop)
                               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>
@@ -1790,7 +1790,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithEmptyRowValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1707">testCheckAndMutate_WithEmptyRowValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1710">testCheckAndMutate_WithEmptyRowValue</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>
@@ -1804,7 +1804,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithWrongValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1776">testCheckAndMutate_WithWrongValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1779">testCheckAndMutate_WithWrongValue</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>
@@ -1818,7 +1818,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithCorrectValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1825">testCheckAndMutate_WithCorrectValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1828">testCheckAndMutate_WithCorrectValue</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>
@@ -1832,7 +1832,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithNonEqualCompareOp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1872">testCheckAndMutate_WithNonEqualCompareOp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1875">testCheckAndMutate_WithNonEqualCompareOp</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>
@@ -1846,7 +1846,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPut_ThatPutWasWritten</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1961">testCheckAndPut_ThatPutWasWritten</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1964">testCheckAndPut_ThatPutWasWritten</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>
@@ -1860,7 +1860,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPut_wrongRowInPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2002">testCheckAndPut_wrongRowInPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2005">testCheckAndPut_wrongRowInPut</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>
@@ -1874,7 +1874,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndDelete_ThatDeleteWasWritten</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2016">testCheckAndDelete_ThatDeleteWasWritten</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2019">testCheckAndDelete_ThatDeleteWasWritten</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>
@@ -1888,7 +1888,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_multiDeleteColumn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2090">testDelete_multiDeleteColumn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2093">testDelete_multiDeleteColumn</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>
@@ -1902,7 +1902,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_CheckFamily</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2116">testDelete_CheckFamily</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2119">testDelete_CheckFamily</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>
@@ -1916,7 +1916,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_mixed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2148">testDelete_mixed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2151">testDelete_mixed</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>
@@ -1932,7 +1932,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteRowWithFutureTs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2210">testDeleteRowWithFutureTs</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2213">testDeleteRowWithFutureTs</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>
@@ -1946,7 +1946,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithLatestTS</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2247">testPutWithLatestTS</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2250">testPutWithLatestTS</a>()
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Tests that the special LATEST_TIMESTAMP option for puts gets replaced by
  the actual timestamp</div>
@@ -1962,7 +1962,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithTsSlop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2292">testPutWithTsSlop</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2295">testPutWithTsSlop</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Tests that there is server-side filtering for invalid timestamp upper
  bound. Note that the timestamp lower bound is automatically handled for us
@@ -1979,7 +1979,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_DeleteOneFamilyNotAnother</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2315">testScanner_DeleteOneFamilyNotAnother</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2318">testScanner_DeleteOneFamilyNotAnother</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>
@@ -1993,7 +1993,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDataInMemoryWithoutWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2352">testDataInMemoryWithoutWAL</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2355">testDataInMemoryWithoutWAL</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>
@@ -2007,7 +2007,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDataInMemoryWithoutWAL</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2401">testDataInMemoryWithoutWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2404">testDataInMemoryWithoutWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                                                org.apache.hadoop.hbase.client.Put&nbsp;originalPut,
                                                org.apache.hadoop.hbase.client.Put&nbsp;addPut,
                                                long&nbsp;delta)
@@ -2024,7 +2024,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteColumns_PostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2426">testDeleteColumns_PostInsert</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2429">testDeleteColumns_PostInsert</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>
@@ -2040,7 +2040,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testaddFamily_PostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2433">testaddFamily_PostInsert</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2436">testaddFamily_PostInsert</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>
@@ -2056,7 +2056,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>doTestDelete_AndPostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2439">doTestDelete_AndPostInsert</a>(org.apache.hadoop.hbase.client.Delete&nbsp;delete)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2442">doTestDelete_AndPostInsert</a>(org.apache.hadoop.hbase.client.Delete&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>,
                                        <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>
@@ -2072,7 +2072,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_CheckTimestampUpdated</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2479">testDelete_CheckTimestampUpdated</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2482">testDelete_CheckTimestampUpdated</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>
@@ -2086,7 +2086,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_FamilyChecker</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2514">testGet_FamilyChecker</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2517">testGet_FamilyChecker</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>
@@ -2100,7 +2100,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_Basic</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2535">testGet_Basic</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2538">testGet_Basic</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>
@@ -2114,7 +2114,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_Empty</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2581">testGet_Empty</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2584">testGet_Empty</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>
@@ -2128,7 +2128,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetWithFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2594">testGetWithFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2597">testGetWithFilter</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>
@@ -2144,7 +2144,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithOkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2654">testGetScanner_WithOkFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2657">testGetScanner_WithOkFamilies</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>
@@ -2158,7 +2158,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithNotOkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2673">testGetScanner_WithNotOkFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2676">testGetScanner_WithNotOkFamilies</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>
@@ -2172,7 +2172,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithNoFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2693">testGetScanner_WithNoFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2696">testGetScanner_WithNoFamilies</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>
@@ -2186,7 +2186,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithRegionClosed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2735">testGetScanner_WithRegionClosed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2738">testGetScanner_WithRegionClosed</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 method tests https://issues.apache.org/jira/browse/HBASE-2516.</div>
 <dl>
@@ -2201,7 +2201,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionScanner_Next</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2762">testRegionScanner_Next</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2765">testRegionScanner_Next</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2215,7 +2215,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromMemStore_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2822">testScanner_ExplicitColumns_FromMemStore_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2825">testScanner_ExplicitColumns_FromMemStore_EnforceVersions</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>
@@ -2229,7 +2229,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2875">testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2878">testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</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>
@@ -2243,7 +2243,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2932">testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2935">testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</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>
@@ -2257,7 +2257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromMemStore_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3009">testScanner_Wildcard_FromMemStore_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3012">testScanner_Wildcard_FromMemStore_EnforceVersions</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>
@@ -2271,7 +2271,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromFilesOnly_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3064">testScanner_Wildcard_FromFilesOnly_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3067">testScanner_Wildcard_FromFilesOnly_EnforceVersions</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>
@@ -2285,7 +2285,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_StopRow1542</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3119">testScanner_StopRow1542</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3122">testScanner_StopRow1542</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>
@@ -2299,7 +2299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3162">testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3165">testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</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>
@@ -2313,7 +2313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_JoinedScanners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3241">testScanner_JoinedScanners</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3244">testScanner_JoinedScanners</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">Added for HBASE-5416
 
@@ -2331,7 +2331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_JoinedScannersWithLimits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3304">testScanner_JoinedScannersWithLimits</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3307">testScanner_JoinedScannersWithLimits</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">HBASE-5416
 
@@ -2348,7 +2348,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testLongQualifier</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3398">testLongQualifier</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3401">testLongQualifier</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Write an HFile block full with Cells whose qualifier that are identical between
  0 and Short.MAX_VALUE. See HBASE-13329.</div>
@@ -2364,7 +2364,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushCacheWhileScanning</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3424">testFlushCacheWhileScanning</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3427">testFlushCacheWhileScanning</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Flushes the cache in a thread while scanning. The tests verify that the
@@ -2383,7 +2383,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWritesWhileScanning</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3555">testWritesWhileScanning</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3558">testWritesWhileScanning</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Writes very wide records and scans for the latest every time.. Flushes and
@@ -2401,7 +2401,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWritesWhileGetting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3732">testWritesWhileGetting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3735">testWritesWhileGetting</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Writes very wide records and gets the latest row every time.. Flushes and
  compacts the region aggressivly to catch issues.</div>
@@ -2419,7 +2419,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testHolesInMeta</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3837">testHolesInMeta</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3840">testHolesInMeta</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>
@@ -2433,7 +2433,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testIndexesScanWithOneDeletedRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3855">testIndexesScanWithOneDeletedRow</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3858">testIndexesScanWithOneDeletedRow</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>
@@ -2447,7 +2447,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBloomFilterSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3892">testBloomFilterSize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3895">testBloomFilterSize</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>
@@ -2461,7 +2461,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAllColumnsWithBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3946">testAllColumnsWithBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3949">testAllColumnsWithBloomFilter</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>
@@ -2475,7 +2475,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteRowWithBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3989">testDeleteRowWithBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3992">testDeleteRowWithBloomFilter</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">Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when
  issuing delete row on columns with bloom filter set to row+col
@@ -2492,7 +2492,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testgetHDFSBlocksDistribution</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4022">testgetHDFSBlocksDistribution</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4025">testgetHDFSBlocksDistribution</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>
@@ -2506,7 +2506,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4101">testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4104">testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</a>()
                                                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Testcase to check state of region initialization task set to ABORTED or not
  if any exceptions during initialization</div>
@@ -2522,7 +2522,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionInfoFileCreation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4133">testRegionInfoFileCreation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4136">testRegionInfoFileCreation</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">Verifies that the .regioninfo file is written on region creation and that
  is recreated if missing during region opening.</div>
@@ -2538,7 +2538,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testParallelIncrementWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4215">testParallelIncrementWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4220">testParallelIncrementWithMemStoreFlush</a>()
                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test case to check increment function with memstore flushing</div>
 <dl>
@@ -2553,7 +2553,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testParallelAppendWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4301">testParallelAppendWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4306">testParallelAppendWithMemStoreFlush</a>()
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test case to check append function with memstore flushing</div>
 <dl>
@@ -2568,7 +2568,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4360">testPutWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4365">testPutWithMemStoreFlush</a>()
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test case to check put function with memstore flushing for same row, same ts</div>
 <dl>
@@ -2583,7 +2583,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDurability</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4415">testDurability</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4420">testDurability</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>
@@ -2597,7 +2597,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>durabilityTest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4464">durabilityTest</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;method,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4469">durabilityTest</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;method,
                             org.apache.hadoop.hbase.client.Durability&nbsp;tableDurability,
                             org.apache.hadoop.hbase.client.Durability&nbsp;mutationDurability,
                             long&nbsp;timeout,
@@ -2617,7 +2617,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionReplicaSecondary</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4519">testRegionReplicaSecondary</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4524">testRegionReplicaSecondary</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>
@@ -2631,7 +2631,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionReplicaSecondaryIsReadOnly</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4569">testRegionReplicaSecondaryIsReadOnly</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4574">testRegionReplicaSecondaryIsReadOnly</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>
@@ -2645,7 +2645,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALFactory</h4>
-<pre>static&nbsp;org.apache.hadoop.hbase.wal.WALFactory&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4623">createWALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>static&nbsp;org.apache.hadoop.hbase.wal.WALFactory&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4628">createWALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                org.apache.hadoop.fs.Path&nbsp;rootDir)
                                                         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>
@@ -2660,7 +2660,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompactionFromPrimary</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4630">testCompactionFromPrimary</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4635">testCompactionFromPrimary</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>
@@ -2674,7 +2674,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4684">putData</a>(int&nbsp;startRow,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4689">putData</a>(int&nbsp;startRow,
                      int&nbsp;numRows,
                      byte[]&nbsp;qf,
                      byte[]...&nbsp;families)
@@ -2691,7 +2691,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4689">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4694">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                      int&nbsp;startRow,
                      int&nbsp;numRows,
                      byte[]&nbsp;qf,
@@ -2709,7 +2709,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4694">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4699">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                     org.apache.hadoop.hbase.client.Durability&nbsp;durability,
                     int&nbsp;startRow,
                     int&nbsp;numRows,
@@ -2728,7 +2728,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyData</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4707">verifyData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;newReg,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4712">verifyData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;newReg,
                        int&nbsp;startRow,
                        int&nbsp;numRows,
                        byte[]&nbsp;qf,
@@ -2746,7 +2746,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertGet</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4726">assertGet</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4731">assertGet</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                       byte[]&nbsp;family,
                       byte[]&nbsp;k)
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -2762,7 +2762,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertScan</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4748">assertScan</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4753">assertScan</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                           byte[]&nbsp;fs,
                           byte[]&nbsp;firstValue)
                    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>
@@ -2778,7 +2778,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushResult</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4780">testFlushResult</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4785">testFlushResult</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Test that we get the expected flush results back</div>
 <dl>
@@ -2793,7 +2793,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initSplit</h4>
-<pre>protected&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4809">initSplit</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4814">initSplit</a>()</pre>
 </li>
 </ul>
 <a name="initHRegion-org.apache.hadoop.hbase.TableName-java.lang.String-org.apache.hadoop.conf.Configuration-byte:A...-">
@@ -2802,7 +2802,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4828">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4833">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;callingMethod,
                                                                    org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    byte[]...&nbsp;families)
@@ -2822,7 +2822,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4837">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4842">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;callingMethod,
                                                                    org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    boolean&nbsp;isReadOnly,
@@ -2843,7 +2843,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4842">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4847">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    byte[]&nbsp;startKey,
                                                                    byte[]&nbsp;stopKey,
                                                                    <a href="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;callingMethod,
@@ -2863,7 +2863,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4857">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4862">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                 byte[]&nbsp;startKey,
                                                                 byte[]&nbsp;stopKey,
                                                                 boolean&nbsp;isReadOnly,
@@ -2886,7 +2886,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOneCell</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4867">checkOneCell</a>(org.apache.hadoop.hbase.Cell&nbsp;kv,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4872">checkOneCell</a>(org.apache.hadoop.hbase.Cell&nbsp;kv,
                           byte[]&nbsp;cf,
                           int&nbsp;rowIdx,
                           int&nbsp;colIdx,
@@ -2901,7 +2901,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_Normal</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4881">testReverseScanner_FromMemStore_SingleCF_Normal</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4886">testReverseScanner_FromMemStore_SingleCF_Normal</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>
@@ -2915,7 +2915,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_LargerKey</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4934">testReverseScanner_FromMemStore_SingleCF_LargerKey</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4939">testReverseScanner_FromMemStore_SingleCF_LargerKey</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>
@@ -2929,7 +2929,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_FullScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4988">testReverseScanner_FromMemStore_SingleCF_FullScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4993">testReverseScanner_FromMemStore_SingleCF_FullScan</a>()
                               

<TRUNCATED>

[07/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
index f2a9072..d2de828 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.266"></a>
 <span class="sourceLineNo">267</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    region.close();<a name="line.269"></a>
+<span class="sourceLineNo">269</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.271"></a>
 <span class="sourceLineNo">272</span>    // Open region again.<a name="line.272"></a>
@@ -289,6035 +289,6038 @@
 <span class="sourceLineNo">281</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.281"></a>
 <span class="sourceLineNo">282</span>    region.flush(true);<a name="line.282"></a>
 <span class="sourceLineNo">283</span>    long max = region.getMaxFlushedSeqId();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    region.close();<a name="line.284"></a>
+<span class="sourceLineNo">284</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.284"></a>
 <span class="sourceLineNo">285</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * Test for Bug 2 of HBASE-10466.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * flushes for region close."<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * @throws IOException<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  @Test<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Get some random bytes.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    byte [] value = Bytes.toBytes(method);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // Make a random put against our cf.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    Put put = new Put(value);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    region.put(put);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    storeFlushCtx.prepare();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Second put something in current memstore<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    region.put(put);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    region.close();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /*<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * See HBASE-10845<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  @Test<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      StoreFlushContext storeFlushCtx;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          throws IOException {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      public void sync(long txid) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        storeFlushCtx.prepare();<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        super.sync(txid);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    faultyLog.init();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        COLUMN_FAMILY_BYTES);<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    // Get some random bytes.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    byte [] value = Bytes.toBytes(method);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    Put put = new Put(value);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean threwIOE = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      region.put(put);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    } catch (IOException ioe) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      threwIOE = true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } finally {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        mss.getDataSize() == 0);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Create a WAL outside of the usual helper in<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * {@code fs.file.impl}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final Configuration walConf = new Configuration(conf);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return new WALFactory(walConf, callingMethod)<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<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>  @Test<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path rootDir = new Path(dir + testName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    hLog.init();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        COLUMN_FAMILY_BYTES);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Put one value<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    byte [] value = Bytes.toBytes(method);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    Put put = new Put(value);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    region.put(put);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    assertTrue(onePutSize &gt; 0);<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    doThrow(new IOException())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    try {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      region.put(put);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      fail("Should have failed with IOException");<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    } catch (IOException expected) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    long expectedSize = onePutSize * 2;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    assertEquals("memstoreSize should be incremented",<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        expectedSize, region.getMemStoreDataSize());<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    assertEquals("flushable size should be incremented",<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    region.setCoprocessorHost(null);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * A test case of HBASE-21041<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @throws Exception Exception<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  @Test<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    byte[] family = Bytes.toBytes("family");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        Put put = new Put(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        put.addColumn(family, family, row);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        region.put(put);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      region.flush(true);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // After flush, data size should be zero<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      // After flush, offheap should be zero<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    } finally {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      this.region = null;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      wals.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * if memstoreSize is not larger than 0."<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @throws Exception<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // Only retry once.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    final User user =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // Inject our faulty LocalFileSystem<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      @Override<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      public Object run() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        FileSystem fs = FileSystem.get(conf);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        HRegion region = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // Initialize region<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              COLUMN_FAMILY_BYTES);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          long size = region.getMemStoreDataSize();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(0, size);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          Put p1 = new Put(row);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          region.put(p1);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          try {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>            LOG.info("Flushing");<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            region.flush(true);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          } catch (DroppedSnapshotException dse) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            // What we are expecting<a name="line.509"></a>
-<span class="sourceLineNo">510</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          // Make it so all writes succeed from here on out<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          ffs.fault.set(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Check sizes.  Should still be the one entry.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          // subtract the right amount, the snapshot size only.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          Put p2 = new Put(row);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          region.put(p2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // it<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region.flush(true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // Make sure our memory accounting is right.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        return null;<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">536</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @Test<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Only retry once.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final User user =<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Inject our faulty LocalFileSystem<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      @Override<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      public Object run() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        FileSystem fs = FileSystem.get(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        HRegion region = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          // Initialize region<a name="line.558"></a>
-<span class="sourceLineNo">559</span>          region = initHRegion(tableName, null, null, false,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          long size = region.getMemStoreDataSize();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          Assert.assertEquals(0, size);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>          Put p1 = new Put(row);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.565"></a>
-<span class="sourceLineNo">566</span>          region.put(p1);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          StoreFlushContext storeFlushCtx =<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          storeFlushCtx.prepare();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          // Now add two entries to the foreground memstore.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Put p2 = new Put(row);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          region.put(p2);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          // Now try close on top of a failing flush.<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          region.close();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          fail();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        } catch (DroppedSnapshotException dse) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          // Expected<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        } finally {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          ffs.fault.set(false);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    });<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Test<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    byte[] family = Bytes.toBytes("family");<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    region.put(put);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    region.flush(true);<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    Scan scan = new Scan();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scan.setMaxVersions(3);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    // open the first scanner<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    region.delete(delete);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    region.flush(true);<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // open the second scanner<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.616"></a>
+<span class="sourceLineNo">286</span>    this.region = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  /**<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * Test for Bug 2 of HBASE-10466.<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * flushes for region close."<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @throws IOException<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Test<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // Get some random bytes.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    byte [] value = Bytes.toBytes(method);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    // Make a random put against our cf.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Put put = new Put(value);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    region.put(put);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    storeFlushCtx.prepare();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // Second put something in current memstore<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    region.put(put);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    region = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  /*<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * See HBASE-10845<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      StoreFlushContext storeFlushCtx;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        super(fs, rootDir, logName, conf);<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>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>      @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      public void sync(long txid) throws IOException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        storeFlushCtx.prepare();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        super.sync(txid);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    faultyLog.init();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        COLUMN_FAMILY_BYTES);<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Get some random bytes.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    byte [] value = Bytes.toBytes(method);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    Put put = new Put(value);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    boolean threwIOE = false;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    try {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      region.put(put);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    } catch (IOException ioe) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      threwIOE = true;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    } finally {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        mss.getDataSize() == 0);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * Create a WAL outside of the usual helper in<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * {@code fs.file.impl}.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    final Configuration walConf = new Configuration(conf);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return new WALFactory(walConf, callingMethod)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  @Test<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path rootDir = new Path(dir + testName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    hLog.init();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        COLUMN_FAMILY_BYTES);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Put one value<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    byte [] value = Bytes.toBytes(method);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(value);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    region.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    assertTrue(onePutSize &gt; 0);<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    doThrow(new IOException())<a name="line.410"></a>
+<span class="sourceLineNo">411</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      region.put(put);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      fail("Should have failed with IOException");<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } catch (IOException expected) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    long expectedSize = onePutSize * 2;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    assertEquals("memstoreSize should be incremented",<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        expectedSize, region.getMemStoreDataSize());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertEquals("flushable size should be incremented",<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>    region.setCoprocessorHost(null);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * A test case of HBASE-21041<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @throws Exception Exception<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Test<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    byte[] family = Bytes.toBytes("family");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        Put put = new Put(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        put.addColumn(family, family, row);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        region.put(put);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      region.flush(true);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // After flush, data size should be zero<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      // After flush, offheap should be zero<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      this.region = null;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      wals.close();<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * if memstoreSize is not larger than 0."<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @throws Exception<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // Only retry once.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    final User user =<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // Inject our faulty LocalFileSystem<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      @Override<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      public Object run() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        FileSystem fs = FileSystem.get(conf);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        HRegion region = null;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          // Initialize region<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              COLUMN_FAMILY_BYTES);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          long size = region.getMemStoreDataSize();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          Assert.assertEquals(0, size);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          Put p1 = new Put(row);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          region.put(p1);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            LOG.info("Flushing");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            region.flush(true);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          } catch (DroppedSnapshotException dse) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            // What we are expecting<a name="line.510"></a>
+<span class="sourceLineNo">511</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          // Make it so all writes succeed from here on out<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          ffs.fault.set(false);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Check sizes.  Should still be the one entry.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          // subtract the right amount, the snapshot size only.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          Put p2 = new Put(row);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          region.put(p2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          // it<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          region.flush(true);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // Make sure our memory accounting is right.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        } finally {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        }<a name="line.533"></a>
+<span class="sourceLineNo">534</span>        return null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    });<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>  @Test<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // Only retry once.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final User user =<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Inject our faulty LocalFileSystem<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      @Override<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      public Object run() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        FileSystem fs = FileSystem.get(conf);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        HRegion region = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>          // Initialize region<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          region = initHRegion(tableName, null, null, false,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          long size = region.getMemStoreDataSize();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>          Assert.assertEquals(0, size);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          Put p1 = new Put(row);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>          region.put(p1);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          StoreFlushContext storeFlushCtx =<a name="line.570"></a>
+<span class="sourceLineNo">571</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          storeFlushCtx.prepare();<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          // Now add two entries to the foreground memstore.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Put p2 = new Put(row);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          region.put(p2);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          // Now try close on top of a failing flush.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          region = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          fail();<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        } catch (DroppedSnapshotException dse) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          // Expected<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        } finally {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ffs.fault.set(false);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        return null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    });<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>  @Test<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    byte[] family = Bytes.toBytes("family");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    region.put(put);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    region.flush(true);<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    Scan scan = new Scan();<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    scan.setMaxVersions(3);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    // open the first scanner<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    region.delete(delete);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    region.flush(true);<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    // open the second scanner<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.618"></a>
+<span class="sourceLineNo">618</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.618"></a>
 <span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // make a major compaction<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.compact(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // open the third scanner<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    scanner1.next(results);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println(results);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    assertEquals(1, results.size());<a name="line.629"></a>
-<span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    results.clear();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner2.next(results);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    System.out.println(results);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    assertEquals(0, results.size());<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    results.clear();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner3.next(results);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    System.out.println(results);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    assertEquals(0, results.size());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    byte[] family = Bytes.toBytes("family");<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    region.put(put);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    region.put(put);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    region.flush(true);<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>    Scan scan = new Scan();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    scan.setMaxVersions(3);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // open the first scanner<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.660"></a>
+<span class="sourceLineNo">620</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // make a major compaction<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.compact(true);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    // open the third scanner<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    scanner1.next(results);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    System.out.println(results);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    results.clear();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    scanner2.next(results);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    System.out.println(results);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    assertEquals(0, results.size());<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    results.clear();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    scanner3.next(results);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    assertEquals(0, results.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>  @Test<a name="line.644"></a>
+<span class="sourceLineNo">645</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    byte[] family = Bytes.toBytes("family");<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    region.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    region.put(put);<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    region.flush(true);<a name="line.655"></a>
+<span class="sourceLineNo">656</span><a name="line.656"></a>
+<span class="sourceLineNo">657</span>    Scan scan = new Scan();<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    scan.setMaxVersions(3);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    // open the first scanner<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.660"></a>
 <span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    region.compact(true);<a name="line.662"></a>
+<span class="sourceLineNo">662</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    scanner1.next(results);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Cell keyValue = results.get(0);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    scanner1.close();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  @Test<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    byte[] family = Bytes.toBytes("family");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    try {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.682"></a>
+<span class="sourceLineNo">664</span>    region.compact(true);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    scanner1.next(results);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    Cell keyValue = results.get(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    scanner1.close();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    byte[] family = Bytes.toBytes("family");<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.682"></a>
 <span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      long maxSeqId = 1050;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      long minSeqId = 1000;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        fs.create(recoveredEdits);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>        long time = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        WALEdit edit = new WALEdit();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.694"></a>
-<span class="sourceLineNo">695</span>            .toBytes(i)));<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.696"></a>
-<span class="sourceLineNo">697</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>        writer.close();<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      for (HStore store : region.getStores()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      assertEquals(maxSeqId, seqId);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      region.getMVCC().advanceTo(seqId);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      Get get = new Get(row);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      Result result = region.get(get);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        assertEquals(1, kvs.size());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    } finally {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      this.region = null;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      wals.close();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    byte[] family = Bytes.toBytes("family");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.733"></a>
+<span class="sourceLineNo">684</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>      long maxSeqId = 1050;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      long minSeqId = 1000;<a name="line.687"></a>
+<span class="sourceLineNo">6

<TRUNCATED>

[21/25] hbase-site git commit: Published site at 2ab8122a24eb8444c2804b7f980bf008f395933d.

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/dcc97e01/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 ee43e50..865d5f6 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 = "2aae247e3f8f8a393b403a82593bdc3a1ba81193";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "2ab8122a24eb8444c2804b7f980bf008f395933d";<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 = "Mon Sep 10 14:44:14 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Tue Sep 11 14:45:27 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 = "e11391d0d63dddbd28b87878935d57f3";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "15a756b17eed0c34f46a577d4852d9ca";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>